Está en la página 1de 751

Universidad de Málaga

Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 1:
Introducción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.0
Índice

1. Introducción
2. Diagrama de bloques
3. CPU
4. Memoria
5. Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.1
Índice

1. Introducción
2. Diagrama de bloques
3. CPU
4. Memoria
5. Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.2
1. Introducción

1. Introducción
Sistemas Electrónicos

Analógicos Digitales

– Señales analógicas (continuas) – Señales digitales (discretas)


– Descripción a nivel eléctrico – Descripción a nivel lógico
– Modelos circuitales precisos – Modelos circuitales simplificados
(polarización, pequeña señal, (funcionalidad, temporización…)
transitorios, ruido, frecuencia…)

 Diseño Complejo  Diseño Sencillo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.3
1. Introducción

Sistemas Electrónicos Digitales

Cableados Programables
Diseño general con un
Diseño específico para
módulo de control (CPU)
cada aplicación con
que permite controlar el
circuitos conectados
hardware mediante
físicamente entre sí
programación software

Combinacionales Circuitos Basados en Basados en


y secuenciales integrados microcontrolador microprocesador

 Dificultad de modificación  Facilidad de modificación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.4
1. Introducción

Sistemas Electrónicos Digitales Programables

Basados en Basados en
microcontrolador microprocesador
(μC) (μP)

– Componentes del sistema – Componentes del sistema


integrados en un único circuito independientes e interconectados
(sistema cerrado) (sistema abierto)
 Facilidad de diseño (no  Alta capacidad de cómputo
integración)
 Flexibilidad (ampliación)
 Menor consumo
 Complejidad de diseño
 Menor coste (integración)
 Flexibilidad (variedad μC)  Mayor consumo
 Baja capacidad de cómputo  Mayor coste

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.5
1. Introducción

Sistemas Electrónicos Digitales Programables

Basados en Basados en
microcontrolador microprocesador
(μC) (μP)
μC

μP
Memoria Memoria
CPU CPU
Periféricos Periféricos
E/S E/S

Buses Buses

Mundo Mundo
Exterior Exterior

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.6
1. Introducción

Sistemas Electrónicos Digitales Programables

Basados en Basados en
microcontrolador microprocesador
(μC) (μP)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.7
Índice

1. Introducción
2. Diagrama de bloques
3. CPU
4. Memoria
5. Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.8
2. Diagrama de bloques

2. Diagrama de bloques

Almacenamiento
Controla transferencias Memoria programa y datos
de datos en el sistema
CPU
Realiza operaciones
sobre los datos Periféricos Comunicación con el
E/S mundo exterior

Buses
• Direcciones: indica
el elemento del
sistema sobre el que
se va a operar Mundo
Exterior
• Datos: transporta la
información con la
que se va a operar
Interconexión de los
• Control: señales elementos del sistema
auxiliares de gestión
del sistema (relojes,
reset…)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.9
2. Diagrama de bloques

MSP430G2533

Memoria

Módulo auxiliar
de gestión

Periféricos
E/S
CPU

Buses

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.10
Índice

1. Introducción
2. Diagrama de bloques
3. CPU
4. Memoria
5. Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.11
3. CPU

3. CPU

Controla transferencias Memoria


de datos en el sistema
CPU
Realiza operaciones
sobre los datos Periféricos
E/S

Buses

Mundo
Exterior

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.12
3. CPU

Características:
─ Longitud de palabra(1): número máximo de bits a procesar en una instrucción
(relacionado con el tamaño del bus de datos: 8, 16, 32…)
─ Capacidad de direccionamiento: número máximo de elementos que se
pueden seleccionar mediante una determinada dirección (relacionado con el
tamaño del bus de direcciones: n bits  2n posiciones)
─ Organización de la memoria: forma de almacenar en la memoria los datos
(little endian, big endian)
─ Velocidad de proceso: tiempo empleado en ejecutar las instrucciones que
procesan la infomación (relacionado con la frecuencia de la señal de reloj que
controla la CPU: KHz – MHz – GHz)
─ Conjunto de instrucciones: grupo de operaciones que puede llevar a cabo la
CPU (aritméticas, lógicas, condicionales…)
─ Modos de direccionamiento: forma de acceder a los datos con los que operar
(registro, indexado, inmediato…)
─ Registros: número, tamaño y funcionalidad de los registros propios de la CPU
para almacenar los datos con los que operar

(1) Se puede definir una palabra como la unidad básica de información con la que puede operar la CPU
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.13
3. CPU

Arquitectura: número y funcionalidad de las instrucciones


─ CISC (Complex Instruction Set Computer): número elevado de instrucciones
complejas (para reducir el número de accesos a memoria)
 Programas más cortos
 CPU más compleja de diseñar
 Menor eficiencia al dificultar el paralelismo en la ejecución de instrucciones
(pipeline)
• Modelo utilizado antiguamente por µP (Intel, AMD)  En desuso
─ RISC (Reduced Instruction Set Computer): número reducido de instrucciones
sencillas (para implementar instrucciones rápidas de ejecutar)
 CPU más sencilla de diseñar
 Mayor eficiencia al favorecer el paralelismo en la ejecución de instrucciones
(pipeline)
 Programas más extensos
• Modelo utilizado por µC y algunos µP (ARM)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.14
3. CPU

MSP430G2533

MSP430G2533 Datasheet

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.15
Índice

1. Introducción
2. Diagrama de bloques
3. CPU
4. Memoria
5. Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.16
4. Memoria

4. Memoria

Almacenamiento
Memoria programa y datos
CPU
Periféricos
E/S

Buses

Mundo
Exterior

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.17
4. Memoria

Características:
─ Capacidad de almacenamiento: cantidad de información que se puede
almacenar (KB – MB – GB)
─ Mutabilidad: capacidad de modificar la información almacenada:
• Sólo lectura: la información no se puede modificar
• Lectura y escritura: la información se puede modificar
─ Volatilidad: capacidad de mantener la información una vez interrumpida la
alimentación:
• Volátil: la información se pierde una vez interrumpida la alimentación
• No volátil: la información no se pierde una vez interrumpida la alimentación
─ Modo de acceso: técnica para acceder a la información almacenada:
• Aleatorio: accede a cualquier información almacenada (RAM)
• Asociativo: accede a la información almacenada buscándola a partir de una
parte de la misma (caché)
─ Tiempo de acceso: retardo en proporcionar la información solicitada

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.18
4. Memoria

Tipos:
Máscara (R)

Mayor velocidad
PROM
Programa ROM EPROM
(NV) (Rw)
EEPROM
Firmware
Flash

SRAM FMP

Mayor velocidad
Datos RAM EDO
(V)
DRAM BEDO
(RW)
SDRAM
DDR

V : Volátil
NV : No volátil
R : Sólo lectura
Rw : Lectura y escritura (escritura más lenta)
RW : Lectura y escritura

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.19
4. Memoria

Arquitectura:
─ Harvard: separa la memoria en dos bloques de memoria independientes, uno
para almacenar el programa y otro para almacenar los datos. Existen buses
diferenciados para acceder a cada bloque de memoria, los cuales pueden tener
distinto tamaño:

Memoria
Instrucciones
Programa
Direcciones
CPU Direcciones

Datos
Datos

 Mayor eficiencia al poder realizar accesos simultáneos a ambos bloques de


memoria para obtener tanto la instrucción como los datos
 Complejidad de diseño de la CPU

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.20
4. Memoria

Arquitectura:
─ Von Neumann: utiliza la memoria para almacenar tanto el programa como los
datos. Los buses para acceder a la memoria son compartidos:

Memoria

Direcciones Programa
CPU
Instrucciones – Datos Datos

 Simplificación de diseño de la CPU


 Menor eficiencia al tener que realizar varios accesos consecutivos a la
memoria para obtener la instrucción y los datos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.21
4. Memoria

MSP430G2533

MSP430G2533 Datasheet

MSP430x2xx Family User's Guide

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.22
Índice

1. Introducción
2. Diagrama de bloques
3. CPU
4. Memoria
5. Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.23
5. Periféricos

5. Periféricos

Memoria
CPU
Periféricos Comunicación con el
E/S mundo exterior

Buses

Mundo
Exterior

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.24
5. Periféricos

Características:
─ Funcionalidad: aumentan las capacidades del sistema al incorporar nuevas
funcionalidades (sobre todo de interfaz con el mundo exterior)
─ Utilización: disponen de distintos registros de control, de forma que escribiendo
los valores adecuados en los mismos se pueden configurar para que realicen las
funciones deseadas:

Activación
Periférico

Periférico
Registro 1 1 0 1 1 1 0 0 0
Registro 2

Registro N 0 0 0 1 1 0 1 0

Generación
Interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.25
5. Periféricos

Tipos:
─ Puertos E/S: adquirieren señales digitales del exterior (pulsadores, teclados…)
y proporcionan señales digitales al exterior (LEDs, displays…)
─ Temporizadores: miden intervalos de tiempo, generan eventos periódicamente,
cuentan sucesos, proporcionan pulsos modulados en anchura (PWMs)…
─ Comunicaciones: implementan distintos protocolos de comunicación para
realizar la interconexión con dispositivos externos (serie, SPI, I2C…)
─ Convertidores: adquieren señales analógicas externas (ADC) o proporcionan
señales analógicas (DAC), útiles para muestrear sensores o controlar actuadores
─ Watchdog: controlan el correcto funcionamiento del sistema generando un reset
si el programa se bloquea
─ Comparadores: controlan el nivel de tensión de señales analógicas
comparándolas con una tensión umbral
─ DMAs: mueven cantidades masivas de datos sin intervención de la CPU
─ Multiplicadores: realizan operaciones de multiplicación
─ Amplificadores operacionales: realizan acondicionamiento de señales
─ Supervisores de alimentación: controlan cortes en la alimentación (brownout)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.26
5. Periféricos

MSP430G2533
Convertidor

Puertos E/S

MSP430G2533 Datasheet

Comunicaciones

Supervisor alimentación Watchdog Temporizadores

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T1.27
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 2:
MSP430

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.0
Índice

1. Introducción 5. CPU
2. Familia MSP430 5.1. Registros
5.1.1. Específicos
2.1. Comparativa de
5.1.2. Propósito general
microcontroladores
5.2. Modos de
2.2. Subfamilia G2xx
direccionamiento
3. Arquitectura 5.3. Instrucciones
3.1. Diagrama de bloques 5.3.1. Formato
3.2. Periféricos 5.3.2. Tamaño y tiempo de
ejecución
4. Mapa de memoria 5.3.3. Codificación
a) Formato I
4.1. Zonas de memoria b) Formato II
4.2. Organización de la c) Formato III
d) Ejemplo
memoria
5.3.4. Descripción
a) Aritméticas
b) Lógicas
c) Bit
d) Datos
e) Control de flujo
f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.1
Índice

1. Introducción 5. CPU
2. Familia MSP430 5.1. Registros
5.1.1. Específicos
2.1. Comparativa de
5.1.2. Propósito general
microcontroladores
5.2. Modos de
2.2. Subfamilia G2xx
direccionamiento
3. Arquitectura 5.3. Instrucciones
3.1. Diagrama de bloques 5.3.1. Formato
3.2. Periféricos 5.3.2. Tamaño y tiempo de
ejecución
4. Mapa de memoria 5.3.3. Codificación
a) Formato I
4.1. Zonas de memoria b) Formato II
4.2. Organización de la c) Formato III
d) Ejemplo
memoria
5.3.4. Descripción
a) Aritméticas
b) Lógicas
c) Bit
d) Datos
e) Control de flujo
f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.2
1. Introducción

1. Introducción
Microcontroladores comerciales: amplio abanico de posibilidades:
─ Elevado número de fabricantes
─ Cada fabricante proporciona distintas familias (sistemas que comparten la
misma filosofía de diseño: bajo consumo, alto rendimiento, bajo coste…)
─ Cada familia ofrece distintas subfamilias (dispositivos que comparten la misma
arquitectura de diseño: tensiones de alimentación, frecuencias de operación,
tipos de memoria…)
─ Cada subfamilia contiene distintos dispositivos (cada uno con unas
características propias: tamaño de la memoria, periféricos disponibles, tipos de
encapsulados…)
Elección: es fundamental elegir adecuadamente el microcontrolador a utilizar:
─ Consumo (sistemas portables)
─ Tamaño de la memoria (cantidad de código y/o datos)
─ Periféricos disponibles (funcionalidades de E/S necesarias)
─ Capacidad de proceso (instrucciones por segundo)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.3
1. Introducción

Fabricantes de μC:

ATMEL STMicroelectronics Freescale Intel

Microchip Motorola Texas Instruments Zilog

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.4
1. Introducción

Texas Instruments:
Fabricante Familia Dispositivo

Subfamilia

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.5
Índice

1. Introducción 5. CPU
2. Familia MSP430 5.1. Registros
5.1.1. Específicos
2.1. Comparativa de
5.1.2. Propósito general
microcontroladores
5.2. Modos de
2.2. Subfamilia G2xx
direccionamiento
3. Arquitectura 5.3. Instrucciones
3.1. Diagrama de bloques 5.3.1. Formato
3.2. Periféricos 5.3.2. Tamaño y tiempo de
ejecución
4. Mapa de memoria 5.3.3. Codificación
a) Formato I
4.1. Zonas de memoria b) Formato II
4.2. Organización de la c) Formato III
d) Ejemplo
memoria
5.3.4. Descripción
a) Aritméticas
b) Lógicas
c) Bit
d) Datos
e) Control de flujo
f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.6
2. Familia MSP430

2. Familia MSP430
MSP430  Texas Instruments (http://www.ti.com)
Características:
─ Diseño optimizado para ultra bajo consumo: bajas tensiones de alimentación
(0.9 V – 3.6 V), distintos modos de bajo consumo y periféricos inteligentes
capaces de operar autónomamente  idóneo para sistemas portables
─ CPU con arquitectura Von Neumann y RISC de 16 bits: pocas instrucciones
pequeñas y rápidas de ejecutar  buena capacidad de proceso
─ Gran cantidad de periféricos de altas prestaciones: temporizadores,
comunicaciones, convertidores, controladores de LCDs…  amplio abanico de
aplicaciones
─ Facilidad de uso: sistema de depuración integrado(1) y potentes entornos de
desarrollo IDE gratuitos  reducido tiempo de diseño
─ Bajo coste: kits de desarrollo completos y numerosos microcontroladores a muy
bajo coste  sistemas económicos

(1) Sistema de depuración basado en el interfaz de comunicación JTAG, que permite el acceso a la CPU en tiempo real para
realizar la depuración de cualquier aplicación (detención del programa, ejecución paso a paso, puntos de ruptura,
exploración de la memoria, visualización de los registros de la CPU y de los periféricos…)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.7
2. Familia MSP430

Aplicaciones:
─ Instrumentación portátil
─ Instrumentación médica
─ Instrumentación de medida
─ Redes de sensores inalámbricos
─ Monitorización de señales
─ Recolección de datos
─ Dispositivos táctiles
─ Electrónica de consumo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.8
2. Familia MSP430 – 2.1. Comparativa de microcontroladores

2.1. Comparativa de microcontroladores


Subfamilias: Subfamilia Periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.9
2. Familia MSP430 – 2.2. Subfamilia G2xx

2.2. Subfamilia G2xx


Dispositivos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.10
Índice

1. Introducción 5. CPU
2. Familia MSP430 5.1. Registros
5.1.1. Específicos
2.1. Comparativa de
5.1.2. Propósito general
microcontroladores
5.2. Modos de
2.2. Subfamilia G2xx
direccionamiento
3. Arquitectura 5.3. Instrucciones
3.1. Diagrama de bloques 5.3.1. Formato
3.2. Periféricos 5.3.2. Tamaño y tiempo de
ejecución
4. Mapa de memoria 5.3.3. Codificación
a) Formato I
4.1. Zonas de memoria b) Formato II
4.2. Organización de la c) Formato III
d) Ejemplo
memoria
5.3.4. Descripción
a) Aritméticas
b) Lógicas
c) Bit
d) Datos
e) Control de flujo
f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.11
3. Arquitectura

3. Arquitectura
MSP430G2533:
─ Von Neumann: utiliza la memoria para almacenar tanto el programa como los
datos
─ RISC de 16 bits: buses de datos y de direcciones de 16 bits:
• Bus de datos de 16 bits  longitud de palabra de 16 bits
• Bus de direcciones de 16 bits  capacidad de direccionamiento de 216
posiciones (216 = 65.536 = 64 KB)

Memoria
16 bits = 64 KB

Direcciones Programa
CPU
Instrucciones – Datos Datos

16 bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.12
3. Arquitectura – 3.1. Diagrama de bloques

3.1. Diagrama de bloques


MSP430G2533:
Memoria

Módulo auxiliar
de gestión

Periféricos
E/S
CPU

Buses

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.13
3. Arquitectura – 3.2. Periféricos

3.2. Periféricos
MSP430G2533:
Convertidor
Analógico/Digital

Puertos E/S

Comunicaciones

Supervisor de Watchdog Temporizadores


Alimentación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.14
Índice

1. Introducción 5. CPU
2. Familia MSP430 5.1. Registros
5.1.1. Específicos
2.1. Comparativa de
5.1.2. Propósito general
microcontroladores
5.2. Modos de
2.2. Subfamilia G2xx
direccionamiento
3. Arquitectura 5.3. Instrucciones
3.1. Diagrama de bloques 5.3.1. Formato
3.2. Periféricos 5.3.2. Tamaño y tiempo de
ejecución
4. Mapa de memoria 5.3.3. Codificación
a) Formato I
4.1. Zonas de memoria b) Formato II
4.2. Organización de la c) Formato III
d) Ejemplo
memoria
5.3.4. Descripción
a) Aritméticas
b) Lógicas
c) Bit
d) Datos
e) Control de flujo
f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.15
4. Mapa de memoria

4. Mapa de memoria
─ Definición: esquema que representa la distribución de las direcciones que
permiten seleccionar los distintos elementos del sistema:
• Registros especiales de la CPU
• Registros de configuración de los periféricos E/S (“Periféricos Mapeados en
Memoria”  se accede a ellos como a posiciones de memoria)
• Memoria del sistema
─ Exclusividad: cada dirección se corresponde con un único elemento del
sistema, y cada elemento del sistema posee una única dirección
─ Niveles de descripción: el mapa de memoria se puede representar en dos
niveles distintos:
• Funcional: uso o funcionalidad que le asigna el sistema a cada dirección
(programa, datos, vectores de interrupción…)
• Físico: tipo de elemento que se encuentra ubicado en cada dirección (Flash,
RAM, periféricos E/S, registros especiales de la CPU…)
─ Tamaño: el mapa de memoria no tiene por qué cubrir la capacidad de
direccionamiento completa de la CPU (depende del tamaño de la memoria
utilizada)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.16
4. Mapa de memoria

Físico Funcional
Dependiente del dispositivo

0xFFFF Vectores
Flash 64 B
0xFFC0 Interrupción

0xFFBF

Flash Código 16 KB

0xC000

NO UTILIZADA

0x10FF Información
Flash 256 B 64 KB
0x1000 Calibración
MSP430x2xx Family User's Guide

+
NO UTILIZADA

0x03FF
RAM Datos 512 B
0x0200
0x01FF
Periféricos 16 bits 256 B
0x0100

0x00FF
Periféricos 8 bits 240 B
0x0010
0x000F
Registros especiales 16 B
0x0000

MSP430G2533
MSP430G2533 Datasheet

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.17
4. Mapa de memoria – 4.1. Zonas de memoria

4.1. Zonas de memoria


Destinada a ubicar el código del programa (al ser memoria
0xFFFF
Flash
Vectores
64 B Flash no volátil permanecen los datos almacenados, es decir,
0xFFC0 Interrupción
el programa, aunque se interrumpa la alimentación del
0xFFBF sistema). También se puede utilizar para almacenar datos fijos
(constantes)
Flash Código 16 KB
Información de calibración del dispositivo generada durante
su fabricación (no debe modificarse)
0xC000

Destinada a ubicar los datos del programa (al ser memoria


NO UTILIZADA
RAM volátil se eliminan los datos almacenados al interrumpir la
alimentación del sistema)
0x10FF Información
Flash 256 B 64 KB
0x1000 Calibración
Configuración de periféricos E/S de 16 bits (se deben realizar
accesos con palabras; si se realizan accesos con bytes, sólo
NO UTILIZADA
se pueden direccionar posiciones pares, y el byte alto del
0x03FF resultado es siempre 0)
RAM Datos 512 B
0x0200
Configuración de periféricos E/S de 8 bits (se deben realizar
0x01FF
0x0100
Periféricos 16 bits 256 B accesos con bytes ; si se realizan accesos con palabras, una
lectura proporciona resultados impredecibles en el contenido
0x00FF
Periféricos 8 bits 240 B del byte alto, y una escritura ignora el contenido del byte alto)
0x0010
0x000F Registros especiales de la CPU (se deben realizar accesos con
Registros especiales 16 B
0x0000 bytes ; no se permite realizar accesos con palabras)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.18
4. Mapa de memoria – 4.2. Organización de la memoria

4.2. Organización de la memoria


─ Tamaño de los datos: aunque la longitud de la palabra es de 16 bits, la CPU
puede acceder a los datos como palabras (16 bits) o como bytes (8 bits)
─ Definiciones:
• Al estar formada una palabra por 2 bytes, se denomina byte menos
significativo o LSB (“Least Significant Byte”) al byte de menor peso (ubicado
en la parte baja de la palabra), y byte más significativo o MSB (“Most
Significant Byte”) al byte de mayor peso (ubicado en la parte alta de la
palabra)
MSB 1 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 LSB

• Al estar formado un byte por 8 bits, se denomina bit menos significativo o


LSb (“Least Significant bit”) al bit de menor peso (ubicado en la parte baja
del byte), y bit más significativo o MSb (“Most Significant bit”) al bit de mayor
peso (ubicado en la parte alta del byte)(1)

MSb 0 0 0 1 1 0 1 0 LSb

(1) Esta definición no es correcta, pues se utiliza el término LSB para denotar tanto al byte menos significativo como al bit
menos significativo indistintamente, y se utiliza el término MSB para denotar tanto al byte más significativo como al bit
más significativo indistintamente. No obstante, se empleará esta notación para evitar ambigüedades
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.19
4. Mapa de memoria – 4.2. Organización de la memoria

─ Endianness: formato de almacenamiento en memoria de los datos que ocupan


más de un byte (como por ejemplo una palabra):
• Little endian: almacena en las direcciones menores de memoria el LSB y
en las direcciones mayores de memoria el MSB
• Big endian: almacena en las direcciones menores de memoria el MSB y en
las direcciones mayores de memoria el LSB

MSB 1 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 LSB

0xB81A

0x0005 0x0005

0x0004 0x0004

0x0003 0xB8 MSB 0x0003 0x1A LSB


0x0002 0x1A LSB 0x0002 0xB8 MSB
0x0001 0x0001

0x0000 0x0000

Little endian Big endian


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.20
4. Mapa de memoria – 4.2. Organización de la memoria

MSP430  Little endian


─ Acceso a bytes: los bytes se encuentran en cualquier dirección de memoria
(par o impar)

MSb LSb

Byte de la dirección xxx9h

Byte de la dirección xxx8h

Byte de la dirección xxx7h

Byte de la dirección xxx6h

Byte de la dirección xxx5h

Byte de la dirección xxx4h

Little endian
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.21
4. Mapa de memoria – 4.2. Organización de la memoria

MSP430  Little endian


─ Acceso a palabras: las palabras se encuentran en direcciones pares de
memoria. En la dirección par de la palabra se encuentra el LSB, y en la dirección
impar inmediatamente superior se encuentra el MSB
MSb LSb Palabra en dirección
impar (N+1)
=
Palabra en dirección
par inferior (N)

MSB Palabra de la
LSB dirección xxx8h Alineamiento 2-bytes

MSB  Sencillez
Palabra de la
LSB dirección xxx6h  Velocidad
 Huecos
MSB Palabra de la
LSB dirección xxx4h

Little endian
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.22
Índice

1. Introducción 5. CPU
2. Familia MSP430 5.1. Registros
5.1.1. Específicos
2.1. Comparativa de
5.1.2. Propósito general
microcontroladores
5.2. Modos de
2.2. Subfamilia G2xx
direccionamiento
3. Arquitectura 5.3. Instrucciones
3.1. Diagrama de bloques 5.3.1. Formato
3.2. Periféricos 5.3.2. Tamaño y tiempo de
ejecución
4. Mapa de memoria 5.3.3. Codificación
a) Formato I
4.1. Zonas de memoria b) Formato II
4.2. Organización de la c) Formato III
d) Ejemplo
memoria
5.3.4. Descripción
a) Aritméticas
b) Lógicas
c) Bit
d) Datos
e) Control de flujo
f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.23
5. CPU

5. CPU
Características:
─ Registros: dispone de 16 registros de 16 bits
─ Modos de direccionamiento: posee 7 modos de direccionamiento para
acceder a los datos
─ Instrucciones: arquitectura RISC con 27 instrucciones básicas y 24
instrucciones emuladas:
• Básicas: son ejecutadas directamente por la CPU
• Emuladas: son instrucciones ficticias que simplifican el desarrollo del
código, y son sustituidas por instrucciones básicas equivalentes

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.24
5. CPU – 5.1. Registros

5.1. Registros

4 registros específicos con funcionalidades especiales

12 registros generales de propósito general

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.25
5. CPU – 5.1. Registros – 5.1.1. Específicos

5.1.1. Específicos
R0: Contador de programa (PC: “Program Counter”)
─ Funcionalidad: apunta a la dirección de la siguiente instrucción a ejecutar
─ Características: como todas las instrucciones tienen un tamaño par en bytes (2,
4 ó 6 bytes), siempre contiene una dirección par
─ Operación: la CPU se encarga de actualizar automáticamente el contador de
programa en función de la instrucción ejecutada

Dirección par

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.26
5. CPU – 5.1. Registros – 5.1.1. Específicos

R1: Puntero de pila (SP: “Stack Pointer”)


─ Funcionalidad: apunta a la parte superior de la pila(1) (stack) del sistema
─ Características:
• Como la pila puede almacenar indistintamente palabras o bytes, el puntero
de pila siempre apunta a una dirección par, para poder acceder
correctamente a las palabras (si se almacena un byte, el puntero de pila se
sigue modificando en dos posiciones)
• Opera con un esquema de predecremento para introducir datos (PUSH) y
postincremento para extraer datos (POP), por lo que la pila crece hacia
las direcciones bajas de memoria (disminuye SP) cuando se introducen
nuevos datos en ella, y decrece hacia las direcciones altas de memoria
(aumenta SP) cuando se extraen datos de ella.
(1) Una pila es una estructura de datos en la que el modo de acceso es de tipo LIFO (Last In First Out  último en entrar,
primero en salir), la cual permite almacenar y recuperar datos ordenadamente. Los datos almacenados se estructuran
de forma “apilada”, por lo que en todo momento sólo se tiene acceso a la parte superior de la pila o TOS (Top Of Stack),
donde se encuentra el último dato almacenado. Para operar con una pila es necesario disponer de un puntero de pila
(SP) que apunte a la parte superior de la pila, gracias al cual se pueden llevar a cabo dos operaciones básicas:
introducir un nuevo dato en la pila (PUSH) y extraer el último dato de la pila (POP). Cualquiera de estas dos operaciones
aumenta o disminuye el tamaño de la pila, por lo que se modifica convenientemente el puntero de pila. Según esta
filosofía, los datos almacenados en último lugar son los primeros en ser recuperados
SP PUSH POP
SP
SP
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.27
5. CPU – 5.1. Registros – 5.1.1. Específicos

• Es necesario inicializar el valor del puntero de pila con la posición a partir de


la cual se quieren empezar a almacenar valores, posición conocida como
base de la pila o BOS (Bottom Of Stack).
• Normalmente se utiliza como base de la pila (BOS) el final de la RAM
(0x0400 en el caso del MSP430G2533), ya que la pila crece hacia las
direcciones bajas de memoria(1)
─ Operación:
• La utiliza automáticamente la CPU para almacenar la dirección de retorno
(PC) de las llamadas a subrutinas, así como la dirección de retorno (PC) y el
registro de estado (SR) durante las interrupciones
• Se puede utilizar para pasar parámetros a las subrutinas
• Se puede utilizar para almacenar datos temporalmente

Dirección par

(1) Igualmente, se suele utilizar como comienzo de la zona de variables el principio de la RAM (0x0200 en el caso del
MSP430G2533), pues las variables se van almacenando en posiciones crecientes de memoria. Con este esquema se
optimiza el uso de la memoria, ya que las variables se van creando desde las posiciones bajas a las posiciones altas de
memoria y la pila va ocupando desde las posiciones altas a las posiciones bajas de memoria, maximizando la distancia
entre ambas zonas (variables y pila) y permitiendo el mayor uso de toda la memoria disponible
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.28
5. CPU – 5.1. Registros – 5.1.1. Específicos

PUSH POP
 
Predecremento Postincremento

Datos
almacenados

Base de la pila
(BOS)
2 1
1

Parte superior de
la pila (TOS) con
el último dato
alnmacenado

NOTA: Con el esquema de predecremento/postincremento utilizado la base de la pila (BOS) nunca contiene datos
almacenados
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.29
5. CPU – 5.1. Registros – 5.1.1. Específicos

R2: Registro de estado (SR: “Status Register”)


─ Funcionalidad: indica y modifica el estado actual de la CPU en función de las
instrucciones ejecutadas
─ Operación: algunas operaciones (como los saltos condicionales) utilizan
implícitamente el registro de estado

Operaciones aritméticas

Bajo consumo

Interrupciones

rw-0: Indica que este bit se puede leer (r) y escribir (w),
y que tras un reset se inicializa a cero (0)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.30
5. CPU – 5.1. Registros – 5.1.1. Específicos

Desbordamiento: resultado
inválido en operaciones
aritméticas (V=1)
Bajo consumo: controlan los
relojes activos en el sistema
Interrupciones: habilita las
interrupciones enmascarables
(GIE=1)
Negativo: resultado negativo
en operaciones aritméticas
(N=1)
Cero: resultado nulo en
operaciones aritméticas (Z=1)
Acarreo: acarreo generado en
operaciones aritméticas (C=1)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.31
5. CPU – 5.1. Registros – 5.1.1. Específicos

R2/R3: Generadores de constantes (CG1/CG2: “Constant Generator”)


─ Funcionalidad: generan(1) algunas constantes comúnmente utilizadas (0, +1,
+2, +4, +8, -1) sin necesidad de que aparezcan explícitamente en el código
─ Características: permiten reducir el tamaño del código y acelerar su ejecución,
al no tener que incluir las constantes explícitamente en el mismo
─ Operación: su utilización es totalmente transparente al programador, siendo el
ensamblador(2) el encargado de sustituir las constantes a generar que aparezcan
en el código por la combinación adecuada de registro (R2/R3) y modo de
direccionamiento origen (bits As) en la codificación de bits de la instrucción

Uso normal del registro R2 (SR)


Uso especial del registro R2
(direccionamiento absoluto)

Uso de los registros R2/R3 como


generadores de constantes
(0, +1, +2, +4, +8, -1)

Codificación Constante

(1) Sólo se utilizan en el modo de direccionamiento inmediato


(2) El ensamblador es el programa que traduce cada instrucción del código fuente en su correspondiente codificación de bits
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.32
5. CPU – 5.1. Registros – 5.1.2. Propósito general

5.1.2. Propósito general


R4-R15:
─ Funcionalidad: registros genéricos para almacenar datos y operar con ellos
─ Características: aunque son registros de 16 bits, se puede operar con ellos en
formato byte o en formato palabra
─ Operación:
• Cuando se utilizan como origen de los datos y se opera en formato byte, la
parte alta del registro (MSB) se ignora
• Cuando se utilizan como destino de los datos y se opera en formato byte, la
parte alta del registro (MSB) se rellena con cero

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.33
5. CPU – 5.2. Modos de direccionamiento

5.2. Modos de direccionamiento


─ Características: sirven para localizar los operandos de cada instrucción, que
son dos para algunas instrucciones (origen y destino) y sólo uno para otras
instrucciones (origen o destino)
─ Operación: existen 7 modos de direccionamiento

Destino
Origen

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.34
5. CPU – 5.2. Modos de direccionamiento

Registro:
─ Operación: el operando se encuentra en un registro (Rn)  se puede utilizar
para mover datos desde/hasta registros

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.35
5. CPU – 5.2. Modos de direccionamiento

Localización Origen

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.36
5. CPU – 5.2. Modos de direccionamiento

Localización Destino

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.37
5. CPU – 5.2. Modos de direccionamiento

Copia Dato

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.38
5. CPU – 5.2. Modos de direccionamiento

Indexado:
─ Operación: el operando se encuentra en la dirección a la que apunta un registro
(Rn) más un determinado desplazamiento (X)  se puede utilizar para mover
datos desde/hasta arrays en memoria

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.39
5. CPU – 5.2. Modos de direccionamiento

Localización Origen
Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.40
5. CPU – 5.2. Modos de direccionamiento

Localización Destino
Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.41
5. CPU – 5.2. Modos de direccionamiento

Copia Dato
Código Instrucción

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.42
5. CPU – 5.2. Modos de direccionamiento

Simbólico:
─ Operación: el operando se encuentra en la dirección identificada por una
etiqueta  se puede utilizar para mover datos desde/hasta posiciones de
memoria identificadas mediante etiquetas (es el modo de direccionamiento
utilizado para referenciar variables)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.43
5. CPU – 5.2. Modos de direccionamiento

Localización Origen

Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.44
5. CPU – 5.2. Modos de direccionamiento

Localización Destino

Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.45
5. CPU – 5.2. Modos de direccionamiento

Copia Dato

Código Instrucción

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.46
5. CPU – 5.2. Modos de direccionamiento

Absoluto:
─ Operación: el operando se encuentra en la dirección identificada por una
determinada posición  se puede utilizar para mover datos desde/hasta
determinadas posiciones de memoria (es el modo de direccionamiento utilizado
para referenciar periféricos)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.47
5. CPU – 5.2. Modos de direccionamiento

Localización Origen

Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.48
5. CPU – 5.2. Modos de direccionamiento

Localización Destino

Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.49
5. CPU – 5.2. Modos de direccionamiento

Copia Dato

Código Instrucción

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.50
5. CPU – 5.2. Modos de direccionamiento

Indirecto:
─ Operación: el operando se encuentra en la dirección a la que apunta un registro
(Rn)  se puede utilizar para mover datos desde posiciones de memoria
identificadas mediante punteros

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.51
5. CPU – 5.2. Modos de direccionamiento

Código Instrucción Localización Origen

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.52
5. CPU – 5.2. Modos de direccionamiento

Código Instrucción Localización Destino

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.53
5. CPU – 5.2. Modos de direccionamiento

Código Instrucción Copia Dato

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.54
5. CPU – 5.2. Modos de direccionamiento

Indirecto con autoincremento:


─ Operación: el operando se encuentra en la dirección a la que apunta un registro
(Rn), el cual se incrementará (en 1 para formato byte y en 2 para formato
palabra) para apuntar a la siguiente dirección tras la ejecución de la instrucción
 se puede utilizar para mover bloques de datos desde posiciones de memoria
identificadas mediante punteros

El registro Rn se incrementa inmediatamente después de


acceder al operando origen y antes de acceder al operando
destino
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.55
5. CPU – 5.2. Modos de direccionamiento

Localización Origen
Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.56
5. CPU – 5.2. Modos de direccionamiento

Localización Destino
Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.57
5. CPU – 5.2. Modos de direccionamiento

Copia Dato
Código Instrucción

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.58
5. CPU – 5.2. Modos de direccionamiento

Inmediato:
─ Operación: el operando se encuentra en la propia instrucción  se puede
utilizar para introducir constantes en memoria/registros (es el modo de
direccionamiento utilizado para configurar periféricos)

N = {0,+1,+2,+4,+8,-1}  se utiliza el generador de constantes


(no es necesaria una palabra adicional para almacenar N)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.59
5. CPU – 5.2. Modos de direccionamiento

Localización Origen
Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.60
5. CPU – 5.2. Modos de direccionamiento

Localización Destino
Código Instrucción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.61
5. CPU – 5.2. Modos de direccionamiento

Copia Dato
Código Instrucción

Origen
modificado
Destino
modificado
Dato
copiado
PC
modificado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.62
5. CPU – 5.2. Modos de direccionamiento

Resumen

Ubicación Acceso Modo Valor


Sintaxis
Dato Dato Direccionamiento Dato

Registro Registro Registro Rn Rn

Indexado X(Rn) MEM[Rn+X]

Puntero Indirecto @Rn MEM[Rn]

Memoria Indirecto + @Rn+ MEM[Rn] ; Rn + (1/2)

Simbólico label MEM[label]


Dirección
Absoluto &label MEM[label]

Instrucción Instrucción Inmediato #value value

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.63
5. CPU – 5.3. Instrucciones

5.3. Instrucciones
Palabra Palabra Palabra

─ Formato: Código Operación Operando … Operando

Operación a realizar Datos sobre los que


operar
Número de operandos

Tamaño de los operandos

Localización de los operandos


(Modos de direccionamiento)

NOTA: En el MSP430 el tamaño de la palabra (longitud de palabra) es de 16 bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.64
5. CPU – 5.3. Instrucciones

─ Codificación: cada instrucción viene definida mediante un patrón de bits


conocido como Código Máquina, que depende de la instrucción y del número,
tamaño y localización de los operandos

0100 0111 0100 1000 = 0x4748  Mover el byte bajo de R7 a R8

Mover R7 Byte R8

─ Representación: para facilitar el desarrollo del código cada instrucción se


representa mediante un Nemónico, que es una abreviatura del patrón de bits
correspondiente a cada instrucción(1)

MOV.B R7,R8  Mover el byte bajo de R7 a R8

0100 0111 0100 1000 = 0x4748

─ Tamaño y tiempo de ejecución: cada instrucción tiene un tamaño establecido


(en palabras) y tarda un determinado número de ciclos de reloj (de la CPU) en
ejecutarse, dependiendo ambos parámetros del tipo de instrucción y del número,
tamaño y localización de los operandos
(1) El programa encargado de traducir los nemónicos a código máquina se conoce como Ensamblador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.65
5. CPU – 5.3. Instrucciones

Características instrucciones MSP430:


─ 27 instrucciones básicas:
• Formato I: instrucciones con 2 operandos Pueden operar con bytes (.B) o
con palabras (.W) – Por defecto
• Formato II: instrucciones con 1 operando operan con palabras

• Formato III: instrucciones de salto


─ 24 instrucciones emuladas: instrucciones virtuales que representan de forma
simplificada algunas instrucciones básicas ampliamente utilizadas. Se utilizan
para facilitar el desarrollo del código, y el ensamblador las sustituye
automáticamente por sus instrucciones básicas equivalentes
RET  MOV @SP+,PC

Emulada Básica

─ Tamaño y tiempo de ejecución :


• 1 a 3 palabras de 16 bits
• 1 a 6 ciclos de reloj de la CPU

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.66
5. CPU – 5.3. Instrucciones

Descripción detallada de cada


instrucción en el documento
“MSP430x2xx Family User's Guide”

Operación  mover el operando origen


(src) al destino (dst)

Nemónico

Efecto de la instrucción en los


bits del registro de estado (SR)

Descripción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.67
5. CPU – 5.3. Instrucciones – 5.3.1. Formato

5.3.1. Formato

Las instrucciones aritméticas simplemente

(2 operandos)
realizan la operación para las que están

Formato I
diseñadas, sin tener en cuenta el tipo de
datos sobre los que operan. Es tarea del
programador elegir la instrucción
adecuada en función de los datos a
procesar (sin signo, con signo, byte,
palabra…) e interpretar el resultado de
dichas instrucciones

(1 operando)
Formato II
Las instrucciones de salto condicional se

Formato III
suelen utilizar en combinación con otras

(Saltos)
instrucciones (aritméticas, comparación,
testeo de bits…), de forma que estas otras
instrucciones actualicen los bits del
registro de estado (SR) antes de
comprobar la condición del salto

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.68
5. CPU – 5.3. Instrucciones – 5.3.2. Tamaño y tiempo de ejecución

5.3.2. Tamaño y tiempo de ejecución


Instrucción más corta y más rápida
(direccionamiento a registro)

Instrucciones más largas y más lentas


(2 operandos)
Formato I
N = {0,+1,+2,+4,+8,-1}  generador
de constantes: menor tamaño (1
palabra menos) y menor tiempo de
ejecución (1 ciclo menos)

Instrucción más larga y más lenta


(direccionamiento absoluto)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.69
5. CPU – 5.3. Instrucciones – 5.3.2. Tamaño y tiempo de ejecución

N = {0,+1,+2,-1}  generador de N = {+4,+8}  no generador de


constantes: menor tamaño (1 constantes: igual tamaño e igual
palabra menos) y menor tiempo de tiempo de ejecución (ERRATA

largas y más lentas


Instrucciones más
ejecución (1 ciclo menos) DISEÑO CPU)

Instrucción más corta y más rápida

(1 operando)
Formato II
(direccionamiento a registro)

Instrucción más larga y más lenta


(direccionamiento absoluto)

Formato III
(Saltos)
Conclusiones:
─ Los modos de direccionamiento tienen una gran influencia en el tamaño y
tiempo de ejecución de las instrucciones. Si hay que optimizar el código en
tamaño y/o velocidad, es necesario elegir el modo de direccionamiento más
eficiente según cada caso (el modo de direccionamiento más eficiente es el
direccionamiento a registro)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.70
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación

5.3.3. Codificación

(2 operandos)
Formato I
(1 operando)
Formato II
Formato III
(Saltos)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.71
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – a) Formato I

a) Formato I

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.72
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – a) Formato I

Código de operación:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.73
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – a) Formato I

Modo de direccionamiento:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.74
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – a) Formato I

Tamaño:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.75
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – b) Formato II

b) Formato II

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.76
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – b) Formato II

Código de operación:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.77
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – b) Formato II

Modo de direccionamiento:

NOTA: Todos los modos de direccionamiento son válidos para las instrucciones PUSH y CALL, y todos los modos de
direccionamiento excepto el inmediato son válidos para el resto de instrucciones
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.78
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – b) Formato II

Tamaño:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.79
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – c) Formato III

c) Formato III

NOTA: El campo C de la instrucción (bits 10 al 12) hace referencia a la condición de salto

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.80
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – c) Formato III

Código de operación:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.81
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – c) Formato III

001 000  JNE/JNZ


001  JEQ/JZ
010  JNC
011  JC
100  JN
101  JGE
110  JL
111  JMP

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.82
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – c) Formato III

Desplazamiento (en palabras) desde el contador de programa


(PC), considerado como un valor de 10 bits con signo (rango válido
desde 511 hasta -512):

PCnew = PCold + 2 + PCoffset x 2  PCoffset = (PCnew – PCold – 2) / 2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.83
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

d) Ejemplo

Loop  0xC000
cont  0x0200

Loop SWPB R10


CMP.B @R10+,cont 0xC009
JNE Loop 0xC008
0xC007
0xC006
0xC005
0xC004
0xC003
0xC002
0xC001
0xC000

Little endian
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.84
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10 Formato II


CMP.B @R10+,cont
JNE Loop

0 0 0 1 0 0 0 0 1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.85
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10 Formato II


CMP.B @R10+,cont
JNE Loop

0 0 1 0 1 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.86
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10 Formato II


CMP.B @R10+,cont
JNE Loop

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.87
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10 Formato II


CMP.B @R10+,cont
JNE Loop

0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0

0x108A

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.88
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont Formato I
JNE Loop

1 0 0 1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.89
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont Formato I
JNE Loop

X = cont – PC
= 0x0200 – 0xC004
= 0x41FC

1 0 1 0 1 1 1 0 0 0 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.90
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont Formato I
JNE Loop

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.91
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont Formato I
JNE Loop

1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0

0x9AF0
0x41FC

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.92
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont
JNE Loop Formato III

0 0 1 0 0 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.93
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont
JNE Loop Formato III

PCoffset = (PCnew – PCold – 2) / 2


= (0xC000 – 0xC006 – 2) / 2
= 0x03FC

1 1 1 1 1 1 1 1 0 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.94
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop SWPB R10


CMP.B @R10+,cont
JNE Loop Formato III

0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0

0x23FC

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.95
5. CPU – 5.3. Instrucciones – 5.3.3. Codificación – d) Ejemplo

Loop  0xC000
cont  0x0200

Loop SWPB R10


CMP.B @R10+,cont 0xC009
JNE Loop 0xC008
0xC007 0x23
0xC006 0xFC
0x108A 0xC005 0x41
0xC004 0xFC
0x9AF0
0xC003 0x9A
0x41FC
0xC002 0xF0
0x23FC
0xC001 0x10
0xC000 0x8A

Little endian
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.96
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción

5.3.4. Descripción
Tipos de instrucciones:
─ Aritméticas
─ Lógicas
─ Bit
─ Datos
─ Control de flujo
─ Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.97
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – a) Aritméticas

a) Aritméticas
Realizan operaciones de cálculo con los datos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.98
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – a) Aritméticas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.99
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – a) Aritméticas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.100
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – a) Aritméticas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.101
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – a) Aritméticas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.102
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – b) Lógicas

b) Lógicas
Realizan operaciones booleanas con los datos (a nivel de bit)

NOTA: Aunque la instrucción OR no está implementada, la instrucción BIS es equivalente (salvo en los bits de estado)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.103
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – b) Lógicas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.104
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – c) Bit

c) Bit
Realizan operaciones a nivel de bit con los datos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.105
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – c) Bit

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.106
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – c) Bit

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.107
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – c) Bit

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.108
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – d) Datos

d) Datos
Realizan operaciones de modificación de datos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.109
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – d) Datos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.110
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – d) Datos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.111
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – e) Control de flujo

e) Control de flujo
Controlan el orden de ejecución del código

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.112
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – e) Control de flujo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.113
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – e) Control de flujo

MUY IMPORTANTE

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.114
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – e) Control de flujo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.115
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – f) Sistema

f) Sistema
Realizan operaciones especiales para controlar el sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.116
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.117
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.118
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.119
5. CPU – 5.3. Instrucciones – 5.3.4. Descripción – f) Sistema

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T2.120
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Ejercicios Tema 2:
MSP430

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.0
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.1
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.2
1. Enunciados – Ejercicio 1

Ejercicio 1:
─ Almacenar las palabras 0x0123, 0x4567 y 0x89AB en una memoria con
formato Little endian comenzando en la posición 0x0000, utilizando para ello
las siguientes representaciones:

0x0004 0x0004

0x0002 0x0002
0x0005 0x0000
0x0000 0x0000
0x0004 0x0001
N+1 N N N+1
0x0003 0x0002

N+1 N N N+1 0x0002 0x0003

0x0000 0x0000 0x0001 0x0004

0x0002 0x0002 0x0000 0x0005

0x0004 0x0004

NOTA: Los símbolos “N” y “N+1” indican que, a nivel de byte, la columna correspondiente de la memoria donde se
encuentran dichos símbolos contienen las direcciones pares e impares respectivamente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.3
1. Enunciados – Ejercicio 1

─ Almacenar las palabras 0x0123, 0x4567 y 0x89AB en una memoria con


formato Big endian comenzando en la posición 0x0000, utilizando para ello las
siguientes representaciones:

0x0004 0x0004

0x0002 0x0002
0x0005 0x0000
0x0000 0x0000
0x0004 0x0001
N+1 N N N+1
0x0003 0x0002

N+1 N N N+1 0x0002 0x0003

0x0000 0x0000 0x0001 0x0004

0x0002 0x0002 0x0000 0x0005

0x0004 0x0004

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.4
1. Enunciados – Ejercicio 2

Ejercicio 2:
─ En un microcontrolador de altas prestaciones se dispone de dos CPUs de 16
bits que comparten una misma memoria. La CPU1 opera con formato Little
endian mientras que la CPU2 opera con formato Big endian.

Memoria
CPU1 CPU2
R0 0x1122 R0 0x5566
0x0004
R1 0x3344 R1 0x7788
0x0002
R2 R2
0x0000
R3 R3
N+1 N

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.5
1. Enunciados – Ejercicio 2

─ Indicar el contenido de la memoria y de los registros R2 y R3 de ambas CPUs


tras ejecutar el siguiente conjunto de instrucciones en el orden indicado:
• CPU1  MOV.W R0,0x0002
• CPU2  MOV.W R1,0x0000
• CPU2  MOV.B R0,0x0005
• CPU1  MOV.B R1,0x0004
• CPU1  MOV.W 0x0000,R2
• CPU2  MOV.W 0x0002,R2
• CPU1  MOV.W 0x0004,R3
• CPU2  MOV.W 0x0004,R3

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.6
1. Enunciados – Ejercicio 3

Ejercicio 3:
─ En un microcontrolador de la familia MSP430 se dispone de los siguientes datos
en los registros de la CPU y en la memoria:

CPU
0x0208 0x09 0x01
R4 0x4004
0x0206 0x03 0x08
R5 0x0550
label 0x0204 0x02 0x00
R6 0x0606
0x0202 0x04 0x06
R7 0x7070
0x0200 0x05 0x07
R8 0x8888
N+1 N

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.7
1. Enunciados – Ejercicio 3

─ Indicar el contenido de los registros de la CPU y de la memoria tras ejecutar el


siguiente conjunto de instrucciones:
MOV.B R4,R7
MOV.W label,R4
MOV.W #label,R5
MOV.W label(R7),R6
MOV.W 2(R5),R7
MOV.B @R4,R8
MOV.B @R4,3(R5)
MOV.B @R5+,0(R5)
MOV.W -2(R5),2(R5)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.8
1. Enunciados – Ejercicio 4

Ejercicio 4:
─ El contenido de la memoria de un microcontrolador cuya CPU opera con formato
Little endian es el que se muestra a continuación, el cual se corresponde con un
programa en código máquina:

0xC016 0x23 0xFC

0xC014 0x83 0x19

0xC012 0x00 0x0C

0xC010 0x4A 0xBA

0xC00E 0x42 0x39

0xC00C 0x83 0x2A

0xC00A 0x40 0x0A

0xC008 0x01 0x20

0xC006 0x5A 0x80

0xC004 0x40 0xB2

0xC002 0x02 0x80

0xC000 0x40 0x31

N+1 N

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.9
1. Enunciados – Ejercicio 4

─ Sabiendo que las direcciones de comienzo de cada instrucción del programa


son las siguientes:

PC 0xC000 – 0xC004 – 0xC00A – 0xC00C – 0xC00E – 0xC010 – 0xC014 – 0xC016 – 0xC018

responder a las siguientes cuestiones:


a) ¿Cuáles son las instrucciones del programa?
b) ¿Qué longitud de palabra tiene el microcontrolador, sabiendo que es
mayor de 8 bits?
c) ¿Qué tamaño tiene cada una de las instrucciones del programa?
d) ¿Cuántos operandos admite como máximo una instrucción?

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.10
1. Enunciados – Ejercicio 5

Ejercicio 5:
─ Indicar el contenido del registro R10 tras ejecutar el siguiente conjunto de
instrucciones en un microcontrolador de la familia MSP430:
MOV.W #0x1111,R10
ADD.W #6,PC
MOV.W #0x2222,R10
JMP FIN
MOV.W #0x3333,R10
JMP FIN
MOV.W #0x4444,R10
FIN JMP FIN

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.11
1. Enunciados – Ejercicio 6

Ejercicio 6:
─ Obtener el código máquina de las siguientes instrucciones en el MSP430:
• MOV.W #0x03,R10
• MOV.W #0x04,R10
• MOV.W @R2,R10
• CLR.W R10
• ADD.W #0x10,R10
• ADD.W #-0x01,R10
• ADD.W @R3+,R10
• INC.W R10

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.12
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.13
2. Solución – Ejercicio 1

Ejercicio 1:

Little endian

0x0004 0x89 0xAB 0x0004 0xAB 0x89

0x0002 0x45 0x67 0x0002 0x67 0x45


0x0005 0x89 0x0000 0x23
0x0000 0x01 0x23 0x0000 0x23 0x01
0x0004 0xAB 0x0001 0x01
N+1 N N N+1
0x0003 0x45 0x0002 0x67

N+1 N N N+1 0x0002 0x67 0x0003 0x45

0x0000 0x01 0x23 0x0000 0x23 0x01 0x0001 0x01 0x0004 0xAB

0x0002 0x45 0x67 0x0002 0x67 0x45 0x0000 0x23 0x0005 0x89

0x0004 0x89 0xAB 0x0004 0xAB 0x89

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.14
2. Solución – Ejercicio 1

Big endian

0x0004 0xAB 0x89 0x0004 0x89 0xAB

0x0002 0x67 0x45 0x0002 0x45 0x67


0x0005 0xAB 0x0000 0x01
0x0000 0x23 0x01 0x0000 0x01 0x23
0x0004 0x89 0x0001 0x23
N+1 N N N+1
0x0003 0x67 0x0002 0x45

N+1 N N N+1 0x0002 0x45 0x0003 0x67

0x0000 0x23 0x01 0x0000 0x01 0x23 0x0001 0x23 0x0004 0x89

0x0002 0x67 0x45 0x0002 0x45 0x67 0x0000 0x01 0x0005 0xAB

0x0004 0xAB 0x89 0x0004 0x89 0xAB

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.15
2. Solución – Ejercicio 2

Ejercicio 2:

Memoria
CPU1 CPU2
R0 0x1122 R0 0x5566
0x0004 0x66 0x44
R1 0x3344 R1 0x7788
0x0002 0x11 0x22
R2 0x8877 R2 0x2211
0x0000 0x88 0x77
R3 0x6644 R3 0x4466
N+1 N

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.16
2. Solución – Ejercicio 3

Ejercicio 3:

CPU
0x0208 0x09 0x01
R4 0x0200
0x0206 0x04 0x06
R5 0x0205
label 0x0204 0x00 0x00
R6 0x0901
0x0202 0x04 0x06
R7 0x0308
0x0200 0x05 0x07
R8 0x0007
N+1 N

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.17
2. Solución – Ejercicio 4

Ejercicio 4:
a) ¿Cuáles son las instrucciones del programa?
b) ¿Qué longitud de palabra tiene el microcontrolador, sabiendo que es
mayor de 8 bits?
c) ¿Qué tamaño tiene cada una de las instrucciones del programa?
d) ¿Cuántos operandos admite como máximo una instrucción?

0x40310280
0x40B25A800120
0x400A
0x832A
0x4239
0x4ABA000C
0x8319
0x23FC

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.18
2. Solución – Ejercicio 4

a) ¿Cuáles son las instrucciones del programa?


b) ¿Qué longitud de palabra tiene el microcontrolador, sabiendo que es
mayor de 8 bits?
c) ¿Qué tamaño tiene cada una de las instrucciones del programa?
d) ¿Cuántos operandos admite como máximo una instrucción?

Código Operación Operando … Operando Código Operación

Instrucción
más
0x40310280 pequeña
0x40B25A800120
0x400A 16 bits
0x832A 16 bits
0x4239 16 bits
Código Operación = Longitud Palabra
0x4ABA000C
0x8319 16 bits
0x23FC 16 bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.19
2. Solución – Ejercicio 4

a) ¿Cuáles son las instrucciones del programa?


b) ¿Qué longitud de palabra tiene el microcontrolador, sabiendo que es
mayor de 8 bits?
c) ¿Qué tamaño tiene cada una de las instrucciones del programa?
d) ¿Cuántos operandos admite como máximo una instrucción?

0x40310280 2 palabras
0x40B25A800120 3 palabras
0x400A 1 palabra
0x832A 1 palabra
0x4239 1 palabra
0x4ABA000C 2 palabras
0x8319 1 palabra
0x23FC 1 palabra

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.20
2. Solución – Ejercicio 4

a) ¿Cuáles son las instrucciones del programa?


b) ¿Qué longitud de palabra tiene el microcontrolador, sabiendo que es
mayor de 8 bits?
c) ¿Qué tamaño tiene cada una de las instrucciones del programa?
d) ¿Cuántos operandos admite como máximo una instrucción?

Código Operación Operando … Operando

1 palabra 1 palabra 1 palabra

0x40310280
0x40B25A800120 3 palabras = Código Operación + 2 operandos
0x400A
0x832A
0x4239
0x4ABA000C
0x8319
0x23FC

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.21
2. Solución – Ejercicio 5

Ejercicio 5:
• R10 0x3333

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.22
2. Solución – Ejercicio 6

Ejercicio 6:
• MOV.W #0x03,R10 0x403A – 0x0003
• MOV.W #0x04,R10 0x422A
• MOV.W @R2,R10 0x422A
• CLR.W R10 0x430A
• ADD.W #0x10,R10 0x503A – 0x0010
• ADD.W #-0x01,R10 0x533A
• ADD.W @R3+,R10 0x533A
• INC.W R10 0x531A

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET2.23
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 3:
Programación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.0
Índice

1. Introducción 3.3. Estructura


3.4. Ejemplos
2. Modelo de programación
3.4.1. Arrays
2.1. Bucle infinito a) Unidimensionales
b) Bidimensionales
2.2. Bajo consumo
3.4.2. Sentencias básicas
3. Ensamblador a) Comparaciones
b) Condiciones
3.1. Lenguaje c) Bucles
3.1.1. Sintaxis
4. C
3.1.2. Ficheros de cabecera
3.1.3. Directivas 4.1. Lenguaje
3.1.4. Constantes 4.1.1. Ficheros de cabecera
3.1.5. Reserva de memoria 4.1.2. Tipos de datos
3.1.6. Macros 4.1.3. Palabras clave
3.2. Inicialización 4.1.4. Directivas
4.1.5. Funciones intrínsecas
3.2.1. Watchdog
4.1.6. Reserva de memoria
3.2.2. Pila
4.1.7. Rutinas de tratamiento
3.2.3. Interrupciones
de interrupción
3.2.4. Periféricos
4.1.8. Manipulación de bits
3.2.5. Rutina Reset

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.1
Índice

4.2. Ejemplos
4.2.1. Manipulación de bytes
a) Punteros
b) Desplazamientos

5. Entornos IDE
5.1. IAR
5.1.1. Estructura
a) Espacio de trabajo
b) Proyecto
5.1.2. Características
extendidas de C
a) Ficheros de cabecera
b) Manipulación de bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.2
Índice

1. Introducción 3.3. Estructura


3.4. Ejemplos
2. Modelo de programación
3.4.1. Arrays
2.1. Bucle infinito a) Unidimensionales
b) Bidimensionales
2.2. Bajo consumo
3.4.2. Sentencias básicas
3. Ensamblador a) Comparaciones
b) Condiciones
3.1. Lenguaje c) Bucles
3.1.1. Sintaxis
4. C
3.1.2. Ficheros de cabecera
3.1.3. Directivas 4.1. Lenguaje
3.1.4. Constantes 4.1.1. Ficheros de cabecera
3.1.5. Reserva de memoria 4.1.2. Tipos de datos
3.1.6. Macros 4.1.3. Palabras clave
3.2. Inicialización 4.1.4. Directivas
4.1.5. Funciones intrínsecas
3.2.1. Watchdog
4.1.6. Reserva de memoria
3.2.2. Pila
4.1.7. Rutinas de tratamiento
3.2.3. Interrupciones
de interrupción
3.2.4. Periféricos
4.1.8. Manipulación de bits
3.2.5. Rutina Reset

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.3
1. Introducción

1. Introducción

Usuario

Descripción de algoritmos de acuerdo a la capacidad


cognitiva humana (JAVA, PHP, Python, Ruby…)
Alto Nivel

Eficiencia
Sencillez
Estructuras de código de alto nivel y acceso al
Nivel Medio
Software

hardware a bajo nivel (C, C++)


Bajo Nivel Representación simbólica del código máquina
(Ensamblador)

Instrucciones que puede ejecutar el hardware


Código Máquina (Patrones de bits)

Microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.4
1. Introducción

Flujo de desarrollo software:

Código(s) fuente
(C)

Compilador

Código(s) fuente
(Ensamblador)

Desarrollo
Ensamblador

Código(s) objeto

Enlazador

Código Máquina

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.5
Índice

1. Introducción 3.3. Estructura


3.4. Ejemplos
2. Modelo de programación
3.4.1. Arrays
2.1. Bucle infinito a) Unidimensionales
b) Bidimensionales
2.2. Bajo consumo
3.4.2. Sentencias básicas
3. Ensamblador a) Comparaciones
b) Condiciones
3.1. Lenguaje c) Bucles
3.1.1. Sintaxis
4. C
3.1.2. Ficheros de cabecera
3.1.3. Directivas 4.1. Lenguaje
3.1.4. Constantes 4.1.1. Ficheros de cabecera
3.1.5. Reserva de memoria 4.1.2. Tipos de datos
3.1.6. Macros 4.1.3. Palabras clave
3.2. Inicialización 4.1.4. Directivas
4.1.5. Funciones intrínsecas
3.2.1. Watchdog
4.1.6. Reserva de memoria
3.2.2. Pila
4.1.7. Rutinas de tratamiento
3.2.3. Interrupciones
de interrupción
3.2.4. Periféricos
4.1.8. Manipulación de bits
3.2.5. Rutina Reset

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.6
2. Modelo de programación

2. Modelo de programación
─ Existen distintos modelos de programación de microcontroladores, siendo los
más habituales:
• Bucle infinito
• Bajo consumo
─ Para aprovechar al máximo las prestaciones de los microcontroladores MSP430
es recomendable basar su programación en el modelo de bajo consumo:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.7
2. Modelo de programación – 2.1. Bucle infinito

2.1. Bucle infinito


─ Bucle: la CPU está continuamente ejecutando código en un bucle cerrado
 Sencillez
Código principal
 Ineficiencia

Bucle infinito

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.8
2. Modelo de programación – 2.2. Bajo consumo

2.2. Bajo consumo


─ Bajo consumo: es deseable mantener al microcontrolador el máximo tiempo
posible en bajo consumo, donde se encuentra detenido sin ejecutar código
─ Interrupciones(1): aunque el microcontrolador se encuentre en bajo consumo
las interrupciones se siguen atendiendo, por lo que automáticamente activan al
microcontrolador para ejecutar el código específico asociado a las mismas (RTI).
Al finalizar el tratamiento de una interrupción el microcontrolador vuelve al estado
anterior a la recepción de la misma, por lo que regresa al bajo consumo

(1) Una interrupción es un evento que provoca que la CPU detenga la ejecución del código en curso y comience a ejecutar
un código específico asociado a la misma, conocido como RTI (Rutina de Tratamiento de Interrupción) o ISR (Interrupt
Service Routine), para atender y gestionar dicho evento. Tras la ejecución de la RTI finaliza el tratamiento de la
interrupción, por lo que la CPU continúa con la ejecución del código en curso a partir de la última instrucción ejecutada
antes de recibir la interrupción
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.9
2. Modelo de programación – 2.2. Bajo consumo

Interrupciones(1):

Interrupción
RTI

Programa

(1) Las interrupciones se describen detalladamente en el Tema 4


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.10
2. Modelo de programación – 2.2. Bajo consumo

Tareas:
─ Interrupciones: asociadas a eventos importantes que deben ser atendidos lo
antes posible, por lo que el código específico asociado a cada interrupción (RTI)
debe ser lo más corto y rápido posible
─ Tarea: si una interrupción requiere un procesamiento intenso (largo y lento)
debe realizarse fuera del código específico asociado a la misma (RTI), por lo que
hay que activar al microcontrolador para sacarlo del bajo consumo y continuar
ejecutando código adicional (conocido como Tarea) una vez finalizado el
tratamiento de la interrupción. Tras la ejecución de este código adicional el
microcontrolador regresa al bajo consumo(1)
─ Interacción: el mecanismo de interacción entre las interrupciones y las tareas
se basa en flags, existiendo un flag para cada tarea que será activado por la
interrupción que requiera la ejecución de la misma
 Eficiencia
 Complejidad

(1) No todas las interrupciones necesitan tener una tarea asociada, en función del procesamiento que deba realizar cada
una. De este modo, las interrupciones que requieran un procesamiento corto y rápido pueden realizarlo en el código
específico asociado (RTI) sin necesidad de utilizar ninguna tarea adicional
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.11
2. Modelo de programación – 2.2. Bajo consumo

Rutinas de Tratamiento
Flujograma: Código principal
de Interrupciones (RTIs)

Activar
flags

Bajo Consumo

Salir bajo
consumo

Comprobar Limpiar Código adicional


flags activos flags activos (Tareas)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.12
Índice

1. Introducción 3.3. Estructura


3.4. Ejemplos
2. Modelo de programación
3.4.1. Arrays
2.1. Bucle infinito a) Unidimensionales
b) Bidimensionales
2.2. Bajo consumo
3.4.2. Sentencias básicas
3. Ensamblador a) Comparaciones
b) Condiciones
3.1. Lenguaje c) Bucles
3.1.1. Sintaxis
4. C
3.1.2. Ficheros de cabecera
3.1.3. Directivas 4.1. Lenguaje
3.1.4. Constantes 4.1.1. Ficheros de cabecera
3.1.5. Reserva de memoria 4.1.2. Tipos de datos
3.1.6. Macros 4.1.3. Palabras clave
3.2. Inicialización 4.1.4. Directivas
4.1.5. Funciones intrínsecas
3.2.1. Watchdog
4.1.6. Reserva de memoria
3.2.2. Pila
4.1.7. Rutinas de tratamiento
3.2.3. Interrupciones
de interrupción
3.2.4. Periféricos
4.1.8. Manipulación de bits
3.2.5. Rutina Reset

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.13
3. Ensamblador

3. Ensamblador
─ Bajo nivel: es el lenguaje de programación más cercano al código máquina, y,
por lo tanto, al propio hardware (microcontrolador):
 Eficiencia: traducción directa entre instrucciones en lenguaje ensamblador
e instrucciones en código máquina  programas cortos y rápidos
 Control: acceso sin restricciones a todos los recursos hardware  código
muy optimizado difícilmente implementable en lenguajes de alto nivel
 Complejidad: escasa abstracción en el lenguaje  poco adecuado para
programas complejos
 Portabilidad: dependencia absoluta del hardware  necesidad de
reescribir el código para cada plataforma hardware

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.14
3. Ensamblador

Flujo de desarrollo software:

Código(s) fuente
(Ensamblador)

Ensamblador

Código(s) objeto

Enlazador

Código Máquina

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.15
3. Ensamblador

─ Código Máquina: patrón de bits que describe la instrucción a ejecutar, así como
el tamaño, número y localización de sus operandos
 Muy complejo de utilizar  propenso a cometer errores de programación

0100 0111 0100 1000 = 0x4748  Mover el byte bajo de R7 a R8

Mover R7 Byte R8

─ Lenguaje Ensamblador: representación simbólica del código máquina de las


diferentes instrucciones, así como del tamaño, número y localización de sus
operandos. Los distintos símbolos empleados para representar cada instrucción
se conocen como Nemónicos
 Simplifica el desarrollo de código  minimiza los errores de programación

MOV.B R7,R8  Mover el byte bajo de R7 a R8


Nemónico Tamaño Operandos
(origen, destino)
(Mover) (Byte) (R7 a R8)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.16
3. Ensamblador

─ Ensamblador (“Assembler”): programa que traduce archivos con código en


lenguaje ensamblador (conocido como código fuente) a archivos con código
máquina (conocido como código objeto). Este proceso de traducción es
conocido como ensamblado. El programa ensamblador proporciona además
distintas facilidades para el desarrollo de código en lenguaje ensamblador:
• Directivas (comandos para el ensamblador que controlan el proceso de
ensamblado)
• Etiquetas (símbolos que representan direcciones de memoria)
• Expresiones (operaciones aritméticas, lógicas, comparaciones…)
• Representación numérica múltiple (decimal, hexadecimal, binaria, octal…)
• Macros (símbolos que representan bloques de código)
─ Enlazador (“Linker”): programa que permite combinar distintos archivos con
código máquina (código objeto) para generar un único archivo con código
máquina ejecutable(1). Este proceso de combinación se conoce como enlazado

(1) Aunque la aplicación esté formada por un único archivo es necesario utilizar el enlazador para generar el archivo con
código máquina ejecutable
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.17
3. Ensamblador

Ejemplo:
Código fuente Código ejecutable

Loop  0xC000
cont  0x0200

Loop SWPB R10


CMP.B @R10+,cont 0xC009
JNE Loop 0xC008
0xC007 0x23
Ensamblado
0xC006 0xFC
0x108A 0xC005 0x41
0xC004 0xFC
0x9AF0
Código objeto 0xC003 0x9A
0x41FC
0xC002 0xF0
0x23FC
0xC001 0x10
0xC000 0x8A

Enlazado
Little endian
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.18
3. Ensamblador – 3.1. Lenguaje ensamblador

3.1. Lenguaje ensamblador


─ Entre los aspectos más importantes que determinan el correcto uso del lenguaje
ensamblador se encuentran:
• Sintaxis: descripción del formato utilizado en las líneas de código
• Ficheros de cabecera: definición de constantes para el microcontrolador
utilizado
• Directivas: comandos proporcionados al programa ensamblador para
controlar el proceso de ensamblado
• Constantes: descripción del formato utilizado en la definición de constantes
• Reserva de memoria: consideraciones a tener en cuenta para gestionar
correctamente la reserva e inicialización de memoria
• Macros: definición de símbolos que representan bloques de código

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.19
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.1. Sintaxis

3.1.1. Sintaxis
─ Una línea de código en lenguaje ensamblador puede estar formada por hasta
cuatro campos separados por espacios o tabulaciones:

Comentario (opcional): campo de texto precedido por


punto y coma (“;”) ignorado durante el proceso de
ensamblado

Operandos (opcional): datos separados por comas


(“,”) de la operación especificada

Operación: nemónico de la instrucción en lenguaje


ensamblador o directiva del ensamblador

Etiqueta (opcional): nombre al que se le asocia el


valor actual del contador de programa (PC), que se Las etiquetas se utilizan en el
corresponde con la dirección de memoria donde se modo de direccionamiento
encuentra la instrucción. Si la etiqueta se sitúa en la simbólico
primera columna de la línea de código no es
necesario utilizar los dos puntos (“:”)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.20
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

3.1.2. Ficheros de cabecera


─ Todas las constantes relacionadas con el microcontrolador utilizado se
encuentran definidas en un fichero de cabecera (“msp430g2533.h” en el caso
del MSP430G2533), que se puede incluir al principio del código con la directiva
#include para simplificar el desarrollo de código en lenguaje ensamblador. Entre
las constantes definidas en este fichero de cabecera se encuentran:
• Constantes genéricas: posición de cada bit dentro de la palabra
• Registro de estado: bits del registro de estado (SR)
• Direcciones de memoria: posiciones de memoria de todos los registros de
los periféricos
• Registros de periféricos: bits de cada registro de los periféricos
• Configuración de periféricos: valores necesarios para establecer una
determinada configuración de cada periférico
• Calibración: posiciones de memoria de la información de calibración del
microcontrolador
• Vectores de interrupción: posiciones de memoria de todos los vectores de
interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.21
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

Fichero de cabecera

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.22
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

Constantes genéricas

Registro de estado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.23
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

Direcciones de memoria

Las direcciones de memoria se


utilizan en el modo de
direccionamiento absoluto

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.24
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

Registros de periféricos

Configuración de periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.25
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

Calibración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.26
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.2. Ficheros de cabecera

Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.27
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.3. Directivas

3.1.3. Directivas
─ Comandos que acepta el ensamblador para controlar el proceso de ensamblado
(no son instrucciones de la CPU, por lo que no generan código):

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.28
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.3. Directivas

─ Control:
• #include “filename”  inserta el contenido del archivo filename en
el archivo actual
• ORG expr  establece el valor del contador de programa (PC) en la
dirección expr
• EVEN  alinea el valor del contador de programa (PC) a la siguiente
dirección par
• END  finaliza el proceso de ensamblado
─ Constantes:
• label EQU expr  asigna el valor expr al símbolo label
─ Macros:
• name MACRO  comienza la definición de una macro denominada name
• ENDM  finaliza la definición de una macro

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.29
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.3. Directivas

─ Datos:
• DB expr1 [,expr2]… ; DC8 expr1 [,expr2]…  reserva tantas
posiciones de tamaño byte como operandos tenga la directiva, y las inicializa
a los valores de dichos operandos (expr1, expr2…)
• DW expr1 [,expr2]… ; DC16 expr1 [,expr2]…  reserva tantas
posiciones de tamaño palabra como operandos tenga la directiva, y las
inicializa a los valores de dichos operandos (expr1, expr2…)
• DS size_expr ; DS8 size_expr  reserva size_expr posiciones
consecutivas de tamaño byte
• DS16 size_expr  reserva size_expr posiciones consecutivas de
tamaño palabra

NOTA: Las directivas DB, DC8, DW y DC16 reservan espacio en memoria y lo inicializan a un valor determinado. Estas
directivas se utilizan tanto para crear variables inicializadas (caso de ubicarlas en la RAM) como para crear
constantes (caso de ubicarlas en la Flash)
NOTA: Las directivas DS, DS8 y DS16 reservan espacio en memoria, pero no lo inicializan a ningún valor determinado (ni
siquiera al valor ‘0’, por lo que inicialmente tendrán el valor que tenga la memoria en dichas posiciones). Estas directivas
se utilizan para crear variables no inicializadas (sólo tiene sentido ubicarlas en la RAM)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.30
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.4. Constantes

3.1.4. Constantes
─ Formatos utilizados por el ensamblador para la especificación de constantes:

Las constantes se utilizan en el


modo de direccionamiento
inmediato

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.31
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.5. Reserva de memoria

3.1.5. Reserva de memoria


─ Define las constantes (situadas en la Flash) y las variables (situadas al principio
de la RAM, 0x0200 en el caso del MSP430G2533) empleadas en el código
─ Se realiza mediante las directivas de datos: DB ; DC8 ; DW ; DC16 ; DS ; DS8 ;
DS16
─ Las constantes y variables de tamaño byte se pueden ubicar tanto en posiciones
pares como impares, por lo que no es necesario controlar la posición donde se
definen
─ Las constantes y variables de tamaño palabra sólo se pueden ubicar en
posiciones pares, por lo que es necesario controlar la posición donde se definen
─ Para garantizar que las posiciones donde se definen las variables son correctas,
la técnica más adecuada consiste en definir en primer lugar todas las variables
de tamaño palabra, y posteriormente las variables de tamaño byte:

ORG 0x0200 Comienzo RAM

var1 DC16 0x1234 0x0200


Palabras (direcciones pares)
var2 DS16 1 0x0202
var3 DC8 0x56 0x0204
Bytes (direcciones pares e impares)
var4 DS8 1 0x0205

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.32
3. Ensamblador – 3.1. Lenguaje ensamblador – 3.1.6. Macros

3.1.6. Macros
─ Se utilizan para definir símbolos que representan bloques de código
─ Se definen mediante las directivas de macros: MACRO ; ENDM
─ Cada macro posee un nombre asignado, y cuando el ensamblador encuentra
dicho nombre en el programa lo sustituye automáticamente por el bloque de
código que representa
─ Son muy útiles para clarificar la estructura del programa, pues utilizando
únicamente el nombre asignado a la macro se puede describir la operación que
realiza el bloque de código completo que representa sin necesidad de conocer
los detalles de implementación del mismo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.33
3. Ensamblador – 3.2. Inicialización

3.2. Inicialización
─ En cualquier programa implementado mediante el lenguaje ensamblador es
necesario realizar una serie de operaciones básicas para su correcto
funcionamiento:
• Watchdog: detener el watchdog del microcontrolador si no se va a utilizar
• Pila: establecer la posición de memoria inicial de la pila (base de la pila)
• Interrupciones: habilitar las interrupciones del microcontrolador
• Periféricos: configurar adecuadamente los periféricos a utilizar
• Rutina Reset: especificar la dirección de memoria donde se encuentra el
código a ejecutar al encender el microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.34
3. Ensamblador – 3.2. Inicialización – 3.2.1. Watchdog

3.2.1. Watchdog
─ El watchdog es un periférico del microcontrolador utilizado para evitar bloqueos
software debido a cualquier circunstancia imprevista en la aplicación
─ Se implementa mediante un temporizador que genera un reset cada vez que la
cuenta alcanza el valor programado
─ Su utilización se basa en las siguientes premisas:
• Código ejecutándose: periódicamente el programa debe reiniciar la cuenta
del watchdog(1) antes de que alcance el valor programado, evitando así que
se genere un reset
• Código bloqueado: si el programa se ha bloqueado por cualquier
circunstancia no podrá reiniciar la cuenta del watchdog antes de que alcance
el valor programado, generándose así un reset que reinicie la aplicación
─ El watchdog se encuentra habilitado por defecto al encender el
microcontrolador(2), por lo que si no se va a utilizar en la aplicación es
imprescindible deshabilitarlo(3) antes de que la cuenta alcance el valor
programado y genere un reset

(1) La cuenta del watchdog se reinicia escribiendo un 1 en el bit WDTCNTCL del registro WDTCTL
(2) Inicialmente el watchdog está configurado para generar un reset cada 30ms aproximadamente
(3) El watchdog se deshabilita con la instrucción: MOV.W #WDTPW+WDTHOLD,&WDTCTL
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.35
3. Ensamblador – 3.2. Inicialización – 3.2.2. Pila

3.2.2. Pila
─ Al margen del posible uso que le pueda dar el usuario, la pila la utiliza
automáticamente la CPU para almacenar la dirección de retorno (PC) de las
llamadas a subrutinas, así como la dirección de retorno (PC) y el registro de
estado (SR) durante las interrupciones
─ Es necesario inicializar el valor del puntero de pila con la posición a partir de la
cual se quieren empezar a almacenar valores (posición conocida como base de
la pila). Normalmente se utiliza como dicha posición el final de la RAM (0x0400
en el caso del MSP430G2533(1)), ya que la pila crece hacia las direcciones bajas
de memoria, mientras que las variables crecen hacia las direcciones altas de
memoria (así se garantiza el mejor uso del tamaño completo de la RAM)
Pila: 0x0400
0x03FF
NO UTILIZADA
Crecimiento de la pila
0x03FF
RAM Datos 512 B RAM Datos
0x0200 512 B

0x01FF Crecimiento de las variables


Periféricos 16 bits
0x0200
Variables: 0x0200

(1) En verdad el final de la RAM se encuentra en la posición 0x03FF, estando la posición 0x0400 en una zona no utilizada
del mapa de memoria. No obstante, al operar la pila con predecremento para introducir datos, la primera vez que se
introduzca un dato el puntero de pila SP se situará en la posición 0x03FE, que se encuentra al final de la RAM
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.36
3. Ensamblador – 3.2. Inicialización – 3.2.3. Interrupciones

3.2.3. Interrupciones
─ Las interrupciones constituyen un recurso imprescindible en cualquier
microcontrolador para poder realizar una programación eficiente
─ Las interrupciones se encuentran deshabilitadas por defecto al encender el
microcontrolador, por lo que es imprescindible habilitarlas(1) antes de que la
aplicación haga uso de ellas

Interrupciones: habilita las


interrupciones enmascarables
(GIE=1)
Registro de estado (SR)

rw-0: Indica que este bit se puede leer (r) y escribir (w),
y que tras un reset se inicializa a cero (0)

(1) Las interrupciones se habilitan con la instrucción EINT


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.37
3. Ensamblador – 3.2. Inicialización – 3.2.4. Periféricos

3.2.4. Periféricos
─ Los periféricos aumentan las capacidades del sistema al incorporar nuevas
funcionalidades (sobre todo de interfaz con el mundo exterior)
─ Su uso es imprescindible en cualquier aplicación, pues la interacción con el
exterior es una necesidad en todo sistema. Es por ello por lo que deben ser
adecuadamente configurados en función de las necesidades de la aplicación a
desarrollar, escribiendo los valores adecuados en los registros de configuración
de los mismos antes de que sean utilizados
Activación
Periférico

Periférico
Registro 1 1 0 1 1 1 0 0 0
Registro 2

Registro N 0 0 0 1 1 0 1 0

Generación
Interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.38
3. Ensamblador – 3.2. Inicialización – 3.2.5. Rutina Reset

3.2.5. Rutina Reset


─ Al encender el microcontrolador (o al realizar un reset) se ejecuta
automáticamente el código asociado a la rutina reset del sistema(1)
─ Para que se ejecute el código implementado al encender el microcontrolador es
necesario asociar dicho código a la rutina reset del sistema, para lo cual hay que
almacenar la posición de comienzo del código en el vector de interrupción de la
rutina reset. Normalmente se utiliza como posición inicial del código el principio
de la Flash (0xC000 en el caso del MSP430G2533)

0xFFFF Vectores 0xFFFF 0xC0


Flash 64 B Flash 2B
0xFFC0 Interrupción 0xFFFE 0x00
0xFFBF

Flash Código 16 KB

0xC000
Código: 0xC000
NO UTILIZADA

(1) El código asociado a la rutina reset comienza con la instrucción ubicada en la dirección de memoria que indica la palabra
de la posición 0xFFFE (vector de interrupción de la rutina reset)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.39
3. Ensamblador – 3.3. Estructura

3.3. Estructura
─ Debido a la complejidad en el desarrollo de programas mediante el lenguaje
ensamblador es conveniente seguir una serie de recomendaciones para
estructurar adecuadamente el código y facilitar así su comprensión
(imprescindible no sólo durante el desarrollo y depuración del mismo, sino
también para su mantenimiento, ampliación y reutilización en otros programas):
• Sangría: escribir adecuadamente el programa para localizar rápidamente
los distintos campos de cada línea de código
• Constantes del microcontrolador: utilizar las constantes del
microcontrolador del fichero de cabecera correspondiente
• Variables y etiquetas: utilizar un nombre representativo para las variables y
las etiquetas
• Comentarios: comentar ampliamente el código
• Modularidad: utilizar macros y subrutinas para dividir el código en módulos
de menor complejidad
• Flujo de ejecución: intentar mantener un flujo lineal de ejecución
minimizando el número de saltos realizados

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.40
3. Ensamblador – 3.3. Estructura – 3.3.1. Sangría

3.3.1. Sangría
... ...
BIC.B #0x08,&0x0022 BIC.B #0x08,&0x0022
BIS.B #0x41,&0x0022 BIS.B #0x41,&0x0022

BIC.B #0x41,&0x0021 BIC.B #0x41,&0x0021

BIS.B #0x01,b BIS.B #0x01,b

CLR.B R15 CLR.B R15


f CLR.B c(R15) f CLR.B c(R15)
INC.B R15 INC.B R15
CMP.B #zzz,R15 CMP.B #zzz,R15
JNE f JNE f

g BIC.B #0x41,&0x0021 g BIC.B #0x41,&0x0021

JMP o JMP o

h BIS.B #0x01,&0x0021 h BIS.B #0x01,&0x0021


MOV.W #a,R10 MOV.W #a,R10
MOV.W #c,R11 MOV.W #c,R11
CLR.B d CLR.B d
XOR.B #0x01,b XOR.B #0x01,b

i BIT.B #0x01,b i BIT.B #0x01,b


JZ l JZ l
JMP n JMP n

j BIS.B #0x40,&0x0021 j BIS.B #0x40,&0x0021

JMP p JMP p

k JMP g k JMP g

l ADD.W #zzz,R11 l ADD.W #zzz,R11


m DEC.W R11 m DEC.W R11
MOV.B @R10+,0(R11) MOV.B @R10+,0(R11)
INC.B d INC.B d
CMP.B #zzz,d CMP.B #zzz,d
JNE m JNE m
JMP j JMP j
... ...

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.41
3. Ensamblador – 3.3. Estructura – 3.3.2. Constantes del microcontrolador

3.3.2. Constantes del microcontrolador


... ...
BIC.B #0x08,&0x0022 BIC.B #BIT3,&P1DIR
BIS.B #0x41,&0x0022 BIS.B #BIT0+BIT6,&P1DIR

BIC.B #0x41,&0x0021 BIC.B #BIT0+BIT6,&P1OUT

BIS.B #0x01,b BIS.B #BIT0,b

CLR.B R15 CLR.B R15


f CLR.B c(R15) f CLR.B c(R15)
INC.B R15 INC.B R15
CMP.B #zzz,R15 CMP.B #zzz,R15
JNE f JNE f

g BIC.B #0x41,&0x0021 g BIC.B #BIT0+BIT6,&P1OUT

JMP o JMP o

h BIS.B #0x01,&0x0021 h BIS.B #BIT0,&P1OUT


MOV.W #a,R10 MOV.W #a,R10
MOV.W #c,R11 MOV.W #c,R11
CLR.B d CLR.B d
XOR.B #0x01,b XOR.B #BIT0,b

i BIT.B #0x01,b i BIT.B #BIT0,b


JZ l JZ l
JMP n JMP n

j BIS.B #0x40,&0x0021 j BIS.B #BIT6,&P1OUT

JMP p JMP p

k JMP g k JMP g

l ADD.W #zzz,R11 l ADD.W #zzz,R11


m DEC.W R11 m DEC.W R11
MOV.B @R10+,0(R11) MOV.B @R10+,0(R11)
INC.B d INC.B d
CMP.B #zzz,d CMP.B #zzz,d
JNE m JNE m
JMP j JMP j
... ...

NOTA: Las constantes del microcontrolador vienen definidas en el fichero de cabecera “msp430g2533.h” en el caso del
MSP430G2533
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.42
3. Ensamblador – 3.3. Estructura – 3.3.3. Variables y etiquetas

3.3.3. Variables y etiquetas


... ...
BIC.B #BIT3,&P1DIR BIC.B #BIT3,&P1DIR
BIS.B #BIT0+BIT6,&P1DIR BIS.B #BIT0+BIT6,&P1DIR

BIC.B #BIT0+BIT6,&P1OUT BIC.B #BIT0+BIT6,&P1OUT

BIS.B #BIT0,b BIS.B #BIT0,flags

CLR.B R15 CLR.B R15


f CLR.B c(R15) clr_dst CLR.B string_dst(R15)
INC.B R15 INC.B R15
CMP.B #zzz,R15 CMP.B #STRING_SIZE,R15
JNE f JNE clr_dst

g BIC.B #BIT0+BIT6,&P1OUT Loop_Begin BIC.B #BIT0+BIT6,&P1OUT

JMP o JMP S2_on_wait

h BIS.B #BIT0,&P1OUT S2_on BIS.B #BIT0,&P1OUT


MOV.W #a,R10 MOV.W #string_org,R10
MOV.W #c,R11 MOV.W #string_dst,R11
CLR.B d CLR.B cont
XOR.B #BIT0,b XOR.B #BIT0,flags

i BIT.B #BIT0,b sentido_copia BIT.B #BIT0,flags


JZ l JZ org_dst_inv
JMP n JMP dst_org_norm

j BIS.B #BIT6,&P1OUT Loop_End BIS.B #BIT6,&P1OUT

JMP p JMP S2_off_wait

k JMP g S2_off JMP Loop_Begin

l ADD.W #zzz,R11 org_dst_inv ADD.W #STRING_SIZE,R11


m DEC.W R11 org_dst_inv_1 DEC.W R11
MOV.B @R10+,0(R11) MOV.B @R10+,0(R11)
INC.B d INC.B cont
CMP.B #zzz,d CMP.B #STRING_SIZE,cont
JNE m JNE org_dst_inv_1
JMP j JMP Loop_End
... ...

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.43
3. Ensamblador – 3.3. Estructura – 3.3.4. Comentarios

3.3.4. Comentarios
... ...
BIC.B #BIT3,&P1DIR BIC.B #BIT3,&P1DIR ; P1.3: Entrada -> S2
BIS.B #BIT0+BIT6,&P1DIR BIS.B #BIT0+BIT6,&P1DIR ; P1.0: Salida -> LED1
; P1.6: Salida -> LED2
BIC.B #BIT0+BIT6,&P1OUT BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2

BIS.B #BIT0,flags BIS.B #BIT0,flags ; Copia dst -> org (no inv)

CLR.B R15 CLR.B R15 ; Inicializa R15


clr_dst CLR.B string_dst(R15) clr_dst CLR.B string_dst(R15) ; Limpia dst(i)
INC.B R15 INC.B R15 ; Incrementa R15
CMP.B #STRING_SIZE,R15 CMP.B #STRING_SIZE,R15 ; Final de la cadena?
JNE clr_dst JNE clr_dst ; No

Loop_Begin BIC.B #BIT0+BIT6,&P1OUT Loop_Begin BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2

JMP S2_on_wait JMP S2_on_wait

S2_on BIS.B #BIT0,&P1OUT S2_on BIS.B #BIT0,&P1OUT ; Enciende LED1


MOV.W #string_org,R10 MOV.W #string_org,R10 ; R10 -> inicio cadena org
MOV.W #string_dst,R11 MOV.W #string_dst,R11 ; R11 -> inicio cadena dst
CLR.B cont CLR.B cont ; Inicializa contador
XOR.B #BIT0,flags XOR.B #BIT0,flags ; Conmuta sentido de copia

sentido_copia BIT.B #BIT0,flags sentido_copia BIT.B #BIT0,flags ; Copia org -> dst (invertido)?
JZ org_dst_inv JZ org_dst_inv ; Si
JMP dst_org_norm JMP dst_org_norm ; No

Loop_End BIS.B #BIT6,&P1OUT Loop_End BIS.B #BIT6,&P1OUT ; Enciende LED2

JMP S2_off_wait JMP S2_off_wait

S2_off JMP Loop_Begin S2_off JMP Loop_Begin

org_dst_inv ADD.W #STRING_SIZE,R11 org_dst_inv ADD.W #STRING_SIZE,R11 ; R11 -> final cadena dst
org_dst_inv_1 DEC.W R11 org_dst_inv_1 DEC.W R11 ; Siguiente caracter
MOV.B @R10+,0(R11) MOV.B @R10+,0(R11) ; Copia org(i) -> dst(N-i)
INC.B cont INC.B cont ; Incrementa contador
CMP.B #STRING_SIZE,cont CMP.B #STRING_SIZE,cont ; Final de la cadena?
JNE org_dst_inv_1 JNE org_dst_inv_1 ; No
JMP Loop_End JMP Loop_End ; Si
... ...

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.44
3. Ensamblador – 3.3. Estructura – 3.3.5. Modularidad

3.3.5. Modularidad
... ...
BIC.B #BIT3,&P1DIR ; P1.3: Entrada -> S2 M_Conf_Perif ; MACRO
BIS.B #BIT0+BIT6,&P1DIR ; P1.0: Salida -> LED1 M_Ini_Var ; MACRO
; P1.6: Salida -> LED2
BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2 Loop_Begin BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2

BIS.B #BIT0,flags ; Copia dst -> org (no inv) JMP S2_on_wait

CLR.B R15 ; Inicializa R15 S2_on BIS.B #BIT0,&P1OUT ; Enciende LED1


clr_dst CLR.B string_dst(R15) ; Limpia dst(i)
INC.B R15 ; Incrementa R15 MOV.W #string_org,R10 ; R10 -> inicio cadena org
CMP.B #STRING_SIZE,R15 ; Final de la cadena? MOV.W #string_dst,R11 ; R11 -> inicio cadena dst
JNE clr_dst ; No CLR.B cont ; Inicializa contador
XOR.B #BIT0,flags ; Conmuta sentido de copia
Loop_Begin BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2
sentido_copia BIT.B #BIT0,flags ; Copia org -> dst (invertido)?
JMP S2_on_wait JZ org_dst_inv ; Si
JMP dst_org_norm ; No
S2_on BIS.B #BIT0,&P1OUT ; Enciende LED1
MOV.W #string_org,R10 ; R10 -> inicio cadena org Loop_End BIS.B #BIT6,&P1OUT ; Enciende LED2
MOV.W #string_dst,R11 ; R11 -> inicio cadena dst
CLR.B cont ; Inicializa contador JMP S2_off_wait
XOR.B #BIT0,flags ; Conmuta sentido de copia
S2_off JMP Loop_Begin
sentido_copia BIT.B #BIT0,flags ; Copia org -> dst (invertido)?
JZ org_dst_inv ; Si org_dst_inv ADD.W #STRING_SIZE,R11 ; R11 -> final cadena dst
JMP dst_org_norm ; No org_dst_inv_1 DEC.W R11 ; Siguiente caracter
MOV.B @R10+,0(R11) ; Copia org(i) -> dst(N-i)
Loop_End BIS.B #BIT6,&P1OUT ; Enciende LED2 INC.B cont ; Incrementa contador
CMP.B #STRING_SIZE,cont ; Final de la cadena?
JMP S2_off_wait JNE org_dst_inv_1 ; No
JMP Loop_End ; Si
S2_off JMP Loop_Begin ...

org_dst_inv ADD.W #STRING_SIZE,R11 ; R11 -> final cadena dst


org_dst_inv_1 DEC.W R11 ; Siguiente caracter
MOV.B @R10+,0(R11) ; Copia org(i) -> dst(N-i)
INC.B cont ; Incrementa contador
CMP.B #STRING_SIZE,cont ; Final de la cadena?
JNE org_dst_inv_1 ; No
JMP Loop_End ; Si
...

NOTA: Las diferencias entre las macros y las subrutinas radican en primer lugar en que las macros operan en tiempo de
compilación (periodo en el que el código está siendo ensamblado por el ensamblador) y las subrutinas operan en
tiempo de ejecución (periodo en el que el código está siendo ejecutado por el microcontrolador), y en segundo lugar en
que las macros originan más código (al actuar mediante un proceso de sustitución de un símbolo por un bloque de
código) y las subrutinas son más lentas (al requerir un tiempo de procesado para introducir y extraer el contador de
programa PC de la pila SP)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.45
3. Ensamblador – 3.3. Estructura – 3.3.6. Flujo de ejecución

3.3.6. Flujo de ejecución


... ...
M_Conf_Perif ; MACRO M_Conf_Perif ; MACRO
M_Ini_Var ; MACRO M_Ini_Var ; MACRO

Loop_Begin BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2 Loop_Begin BIC.B #BIT0+BIT6,&P1OUT ; Apaga LED1 y LED2

JMP S2_on_wait S2_on_wait BIT.B #BIT3,&P1IN ; S2 pulsado?


JNZ S2_on_wait ; No
S2_on BIS.B #BIT0,&P1OUT ; Enciende LED1
BIS.B #BIT0,&P1OUT ; Enciende LED1
MOV.W #string_org,R10 ; R10 -> inicio cadena org
MOV.W #string_dst,R11 ; R11 -> inicio cadena dst MOV.W #string_org,R10 ; R10 -> inicio cadena org
CLR.B cont ; Inicializa contador MOV.W #string_dst,R11 ; R11 -> inicio cadena dst
XOR.B #BIT0,flags ; Conmuta sentido de copia CLR.B cont ; Inicializa contador
XOR.B #BIT0,flags ; Conmuta sentido de copia
sentido_copia BIT.B #BIT0,flags ; Copia org -> dst (invertido)?
JZ org_dst_inv ; Si sentido_copia BIT.B #BIT0,flags ; Copia org -> dst (invertido)?
JMP dst_org_norm ; No JZ org_dst_inv ; Si

Loop_End BIS.B #BIT6,&P1OUT ; Enciende LED2 dst_org_norm MOV.B @R11+,0(R10) ; Copia dst(i) -> org(i)
INC.W R10 ; Siguiente caracter
JMP S2_off_wait INC.B cont ; Incrementa contador
CMP.B #STRING_SIZE,cont ; Final de la cadena?
S2_off JMP Loop_Begin JNE dst_org_norm ; No
JMP Loop_End
org_dst_inv ADD.W #STRING_SIZE,R11 ; R11 -> final cadena dst
org_dst_inv_1 DEC.W R11 ; Siguiente caracter org_dst_inv ADD.W #STRING_SIZE,R11 ; R11 -> final cadena dst
MOV.B @R10+,0(R11) ; Copia org(i) -> dst(N-i) org_dst_inv_1 DEC.W R11 ; Siguiente caracter
INC.B cont ; Incrementa contador MOV.B @R10+,0(R11) ; Copia org(i) -> dst(N-i)
CMP.B #STRING_SIZE,cont ; Final de la cadena? INC.B cont ; Incrementa contador
JNE org_dst_inv_1 ; No CMP.B #STRING_SIZE,cont ; Final de la cadena?
JMP Loop_End ; Si JNE org_dst_inv_1 ; No
... ...

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.46
3. Ensamblador – 3.4. Ejemplos

3.4. Ejemplos
─ Arrays: estructuras de datos que permiten almacenar un conjunto de datos
ordenados en una disposición tipo tabla
─ Sentencias básicas: implementación de estructuras de código propias de
lenguajes de alto nivel

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.47
3. Ensamblador – 3.4. Ejemplos – 3.4.1. Arrays

3.4.1. Arrays
• Unidimensionales: lista de datos con una única fila y varias columnas

Dato Dato Dato Dato Dato Dato


1 2 3 4 5 6

• Bidimensionales: tabla de datos con varias filas y varias columnas

Dato Dato Dato Dato Dato Dato


1_1 1_2 1_3 1_4 1_5 1_6
Dato Dato Dato Dato Dato Dato
2_1 2_2 2_3 2_4 2_5 2_6
Dato Dato Dato Dato Dato Dato
3_1 3_2 3_3 3_4 3_5 3_6
Dato Dato Dato Dato Dato Dato
4_1 4_2 4_3 4_4 4_5 4_6

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.48
3. Ensamblador – 3.4. Ejemplos – 3.4.1. Arrays – a) Unidimensionales

a) Unidimensionales
; Array unidimensional: 01x08 (columnas: 00 -> 07)
array DC8 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 ; Array: columnas (datos)

...
MOV.W #array,R10 ; Direccion del array
MOV.B #3,R11 ; Columna a acceder (R11)
CALL #val_array ; Acceder al dato (R15)
...

val_array ADD.W R10,R11 ; Buscar columna


; Direccion del array +
; Columna a acceder =
; Direccion del dato
MOV.B @R11,R15 ; Dato seleccionado
RET

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.49
3. Ensamblador – 3.4. Ejemplos – 3.4.1. Arrays – b) Bidimensionales

b) Bidimensionales
; Array bidimensional: 04x08 (filas: 00 -> 03; columnas: 00 -> 07)
array DC16 array_f0,array_f1,array_f2,array_f3 ; Array: direcciones de las filas

array_f0 DC8 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 ; Fila 0: columnas (datos)


array_f1 DC8 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 ; Fila 1: columnas (datos)
array_f2 DC8 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 ; Fila 2: columnas (datos)
array_f3 DC8 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37 ; Fila 3: columnas (datos)

...
MOV.W #array,R10 ; Direccion del array
MOV.B #2,R11 ; Fila a acceder (R11)
MOV.B #5,R12 ; Columna a acceder (R12)
CALL #val_array ; Acceder al dato (R15)
...

val_array RLA.W R11 ; Buscar fila


ADD.W R10,R11 ; Direccion del array +
; Fila a acceder x2 (palabra) =
; Direccion de la fila
ADD.W @R11,R12 ; Buscar columna
; Direccion de la fila +
; Columna a acceder =
; Direccion del dato
MOV.B @R12,R15 ; Dato seleccionado
RET

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.50
3. Ensamblador – 3.4. Ejemplos – 3.4.2. Sentencias básicas

3.4.2. Sentencias básicas


• Comparaciones: expresiones que permiten comparar datos
• Condiciones: secciones de código que se ejecutan si se cumplen
determinadas condiciones
• Bucles: secciones de código que se ejecutan repetidas veces

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.51
3. Ensamblador – 3.4. Ejemplos – 3.4.2. Sentencias básicas – a) Comparaciones

a) Comparaciones

• A=B CMP.W A,B ; A=B? CMP.W A,B ; A=B?


JEQ True ; Si JEQ True ; Si
… ; No … ; No

• A≠B CMP.W A,B ; A≠B? CMP.W A,B ; A≠B?


JNE True ; Si JNE True ; Si
… ; No … ; No

• A>B CMP.W A,B ; A>B? CMP.W A,B ; A>B?


JLO True ; Si JL True ; Si
… ; No … ; No

• A<B CMP.W B,A ; A<B? CMP.W B,A ; A<B?


JLO True ; Si JL True ; Si
… ; No … ; No

• A≥B CMP.W B,A ; A≥B? CMP.W B,A ; A≥B?


JHS True ; Si JGE True ; Si
… ; No … ; No

• A≤B CMP.W A,B ; A≤B? CMP.W A,B ; A≤B?


JHS True ; Si JGE True ; Si
… ; No … ; No

Sin signo Con signo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.52
3. Ensamblador – 3.4. Ejemplos – 3.4.2. Sentencias básicas – a) Comparaciones

• A=B CMP.W A,B ; A=B? CMP.W A,B ; A=B?


JNE False ; No JNE False ; No
… ; Si … ; Si

• A≠B CMP.W A,B ; A≠B? CMP.W A,B ; A≠B?


JEQ False ; No JEQ False ; No
… ; Si … ; Si

• A>B CMP.W A,B ; A>B? CMP.W A,B ; A>B?


JHS False ; No JGE False ; No
… ; Si … ; Si

• A<B CMP.W B,A ; A<B? CMP.W B,A ; A<B?


JHS False ; No JGE False ; No
… ; Si … ; Si

• A≥B CMP.W B,A ; A≥B? CMP.W B,A ; A≥B?


JLO False ; No JL False ; No
… ; Si … ; Si

• A≤B CMP.W A,B ; A≤B? CMP.W A,B ; A≤B?


JLO False ; No JL False ; No
… ; Si … ; Si

Sin signo Con signo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.53
3. Ensamblador – 3.4. Ejemplos – 3.4.2. Sentencias básicas – b) Condiciones

b) Condiciones

• if – else if (A==B) { if1 CMP.W A,B ; A=B?


D=0; JNE if2 ; No
} MOV.W #0,D ; Si
else if (A==C) { JMP end
D=1; if2 CMP.W A,C ; A=C?
} JNE else ; No
else { MOV.W #1,D ; Si
D=2; JMP end
} else MOV.W #2,D
end …

• switch – case switch (A) { case1 CMP.W #1,A ; A=1?


case (1): { JNE case2 ; No
B=0; MOV.W #0,B ; Si
break; JMP end
} case2 CMP.W #2,A ; A=2?
case (2): { JNE def ; No
B=1; MOV.W #1,B ; Si
break; JMP end
} def MOV.W #2,B
default: { end …
B=2;
break;
}
}

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.54
3. Ensamblador – 3.4. Ejemplos – 3.4.2. Sentencias básicas – c) Bucles

c) Bucles

• for for (A=0;A<5;A++) { MOV.W #0,A ; A=0


B++; for INC.W B
} INC.W A ; A++
CMP.W #5,A ; A<5?
JLO for ; Si
… ; No

• while while (A!=B) { while CMP.W A,B ; A≠B?


A++; JEQ end ; No
} INC.W A ; Si
JMP while
end …

• do – while do { do INC.W A
A++; CMP.W A,B ; A≠B?
} while (A!=B); JNE do ; Si
end … ; No

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.55
Índice

1. Introducción 3.3. Estructura


3.4. Ejemplos
2. Modelo de programación
3.4.1. Arrays
2.1. Bucle infinito a) Unidimensionales
b) Bidimensionales
2.2. Bajo consumo
3.4.2. Sentencias básicas
3. Ensamblador a) Comparaciones
b) Condiciones
3.1. Lenguaje c) Bucles
3.1.1. Sintaxis
4. C
3.1.2. Ficheros de cabecera
3.1.3. Directivas 4.1. Lenguaje
3.1.4. Constantes 4.1.1. Ficheros de cabecera
3.1.5. Reserva de memoria 4.1.2. Tipos de datos
3.1.6. Macros 4.1.3. Palabras clave
3.2. Inicialización 4.1.4. Directivas
4.1.5. Funciones intrínsecas
3.2.1. Watchdog
4.1.6. Reserva de memoria
3.2.2. Pila
4.1.7. Rutinas de tratamiento
3.2.3. Interrupciones
de interrupción
3.2.4. Periféricos
4.1.8. Manipulación de bits
3.2.5. Rutina Reset

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.56
Índice

4.2. Ejemplos
4.2.1. Manipulación de bytes
a) Punteros
b) Desplazamientos

5. Entornos de desarrollo
5.1. IAR Embedded
Workbench
5.1.1. Estructura
a) Espacio de trabajo
b) Proyecto
5.1.2. Características
extendidas de C
a) Ficheros de cabecera
b) Manipulación de bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.57
4. C

4. C
─ Nivel medio: lenguaje de programación con estructuras de control de alto nivel
y acceso al hardware a bajo nivel
 Sencillez: mayor nivel de abstracción (tipos de datos, sentencias básicas,
librerías, gestión del acceso a memoria, uso de los modos de
direccionamiento, inicialización de la pila, inicialización del vector de
interrupción de la rutina reset con la función main, acceso al mapa de
memoria completo mediante punteros…)  simplificación en el
desarrollo del código
 Portabilidad: independencia del hardware  código válido para distintas
plataformas hardware
 Eficiencia: cada sentencia se traduce en varias instrucciones en código
máquina  la eficiencia del código depende del compilador(1)
 Control: acceso limitado a los recursos hardware  algunas operaciones
difícilmente implementables(2)
(1) Los compiladores son cada vez más eficientes en la optimización del código máquina generado, por lo que la pérdida de
eficiencia es poco apreciable en general, restringiéndose el uso de lenguajes de bajo nivel a rutinas realmente críticas
en tamaño y/o velocidad
(2) Cada lenguaje de alto nivel posee sus propias restricciones a la hora de acceder a los recursos hardware, aunque el
lenguaje C permite acceder prácticamente a todos los recursos del mismo (salvo escasas excepciones, como por
ejemplo algunos registros específicos de la CPU, a los cuales no se puede acceder)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.58
4. C

Flujo de desarrollo software:

Código(s) fuente
(C)

Compilador

Código(s) fuente
(Ensamblador)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.59
4. C

─ Compilador (“Compiler”): programa que traduce archivos con código en


lenguaje C (conocido como código fuente) a archivos con código en lenguaje
ensamblador (conocido como código fuente)(1). Este proceso de traducción es
conocido como compilación. El programa compilador proporciona además
distintas facilidades para el desarrollo de código en lenguaje C:
• Directivas (comandos para el compilador que controlan el proceso de
compilación)
• Definición de funciones especiales (rutinas de tratamiento de interrupción)
• Acceso a recursos hardware (funciones “intrínsecas”)
• Operaciones aritméticas complejas (librerías matemática y de punto flotante)

(1) Los archivos con código en lenguaje ensamblador deben ser posteriormente ensamblados y enlazados para generar un
archivo con código máquina ejecutable
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.60
4. C

Ejemplo:

for (cont = 0; cont < 10; cont++) {


array[cont] += 32; Código fuente
(C)
}

Compilación

MOV.W #0x0, R15


JMP ??main_1
??main_0: MOV.W R15, R14
RLA.W R14
ADD.W SP, R14 Código fuente
(ensamblador)
ADD.W #0x20, 0(R14)
ADD.W #0x1, R15
??main_1: CMP.W #0xa, R15
JL ??main_0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.61
4. C – 4.1. Lenguaje C

4.1. Lenguaje C
─ Entre los aspectos más importantes que determinan el correcto uso del lenguaje
C para la programación de microcontroladores se encuentran:
• Ficheros de cabecera: definición de constantes para el microcontrolador
utilizado
• Tipos de datos: formato y tamaño de los datos básicos disponibles
• Palabras clave: extensión de las palabras clave básicas del lenguaje C para
soportar características especiales del microcontrolador
• Directivas: comandos proporcionados al programa compilador para
controlar el proceso de compilación
• Funciones intrínsecas: funciones predefinidas que permiten acceder a
recursos específicos del microcontrolador
• Reserva de memoria: consideraciones a tener en cuenta durante la reserva
e inicialización de memoria
• Rutinas de tratamiento de interrupción: declaración de las rutinas de
tratamiento de interrupción
• Manipulación de bits: sentencias a utilizar para la manipulación de los bits
de cualquier dato
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.62
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

4.1.1. Ficheros de cabecera


─ Todas las constantes relacionadas con el microcontrolador utilizado se
encuentran definidas en un fichero de cabecera (“msp430g2533.h” en el caso
del MSP430G2533), que se puede incluir al principio del código con la directiva
#include para simplificar el desarrollo de código en lenguaje C. Entre las
constantes definidas en este fichero de cabecera se encuentran:
• Constantes genéricas: posición de cada bit dentro de la palabra
• Registro de estado: bits del registro de estado (SR)
• Direcciones de memoria: posiciones de memoria de todos los registros de
los periféricos
• Registros de periféricos: bits de cada registro de los periféricos
• Configuración de periféricos: valores necesarios para establecer una
determinada configuración de cada periférico
• Calibración: posiciones de memoria de la información de calibración del
microcontrolador
• Vectores de interrupción: posiciones de memoria de todos los vectores de
interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.63
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Fichero de cabecera

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.64
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Definiciones para el
Lenguaje Ensamblador

Definiciones para el
Lenguaje C

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.65
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Constantes genéricas

Registro de estado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.66
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Direcciones de memoria

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.67
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Registros de periféricos

Configuración de periféricos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.68
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Calibración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.69
4. C – 4.1. Lenguaje C – 4.1.1. Ficheros de cabecera

Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.70
4. C – 4.1. Lenguaje C – 4.1.2. Tipos de datos

4.1.2. Tipos de datos

Tamaño byte

Tamaño palabra

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.71
4. C – 4.1. Lenguaje C – 4.1.3. Palabras clave

4.1.3. Palabras clave

Modificador que se aplica


sobre la definición de una
función para indicar que se
trata de una rutina de
tratamiento de interrupción(1)

(1) Para el correcto funcionamiento del microcontrolador es necesario indicar qué función implementa una rutina de
tratamiento de interrupción, pues este tipo de funciones deben realizar operaciones especiales durante su ejecución
(salvar y restaurar el registro de estado SR, inicializar el bit GIE del registro de estado SR a ‘0’…)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.72
4. C – 4.1. Lenguaje C – 4.1.4. Directivas

4.1.4. Directivas
─ Se especifican mediante la palabra #pragma seguida de la directiva a aplicar:

Indica el número de vector <N> de la rutina


de tratamiento de interrupción que se defina
a continuación(1): #pragma vector = <N>

(1) Para especificar el número del vector <N> de la rutina de tratamiento de interrupción de pueden utilizar tanto valores
numéricos como las constantes definidas en el fichero de cabecera “msp430g2533.h” para los vectores de interrupción
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.73
4. C – 4.1. Lenguaje C – 4.1.5. Funciones intrínsecas

4.1.5. Funciones intrínsecas


Permiten modificar el registro de estado SR
desde el programa principal o desde una
rutina de tratamiento de interrupción

Permiten entrar en un modo de bajo


Permiten habilitar y deshabilitar las
consumo desde el programa principal o
interrupciones enmascarables mediante el
salir de un modo de bajo consumo desde
bit GIE del registro de estado SR
una rutina de tratamiento de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.74
4. C – 4.1. Lenguaje C – 4.1.5. Funciones intrínsecas

─ Prototipos de las funciones intrínsecas:


• Se encuentran definidas en el fichero de cabecera “intrinsics.h”, el cual se
incluye automáticamente a través del fichero de cabecera “msp430g2533.h”:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.75
4. C – 4.1. Lenguaje C – 4.1.5. Funciones intrínsecas

─ Prototipos de las principales funciones intrínsecas(1):


• void __bic_SR_register(unsigned short);
• void __bic_SR_register_on_exit(unsigned short);
• void __bis_SR_register(unsigned short);
• void __bis_SR_register_on_exit(unsigned short);
• void __disable_interrupt(void);
• void __enable_interrupt(void);
• void __low_power_mode_n(void);(2)(3)
• void __low_power_mode_off_on_exit(void);

(1) Una descripción detallada de estas funciones y sus parámetros se puede encontrar en el documento “IAR C/C++
Compiler”
(2) El valor del modo de bajo consumo deseado “n” debe estar comprendido entre 0 y 4
(3) Estas funciones también habilitan las interrupciones enmascarables mediante el bit GIE del registro de estado SR
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.76
4. C – 4.1. Lenguaje C – 4.1.6. Reserva de memoria

4.1.6. Reserva de memoria


─ Las variables utilizadas en el código son ubicadas por el compilador en distintas
zonas de la memoria, en función del tipo de variables utilizadas:
• Locales: las variables locales son variables temporales que deben
permanecer accesibles únicamente durante el tiempo de ejecución de la
función donde se definen, por lo que se ubican en la pila (“stack”) y en los
registros de propósito general de la CPU
• Globales: las variables globales son variables permanentes que deben
permanecer accesibles durante todo el tiempo de ejecución del código, por
lo que se ubican en la memoria del microcontrolador
• Dinámicas: las variables dinámicas creadas con funciones de gestión de
memoria (“malloc”) se ubican en el montón (“heap”)(1)
─ Puesto que la pila y el montón tienen un tamaño limitado en la memoria RAM
del microcontrolador, es muy importante para evitar funcionamientos erróneos e
inesperados en el código no sobrepasar dicho tamaño al definir las variables(2)(3)

(1) Sólo se reserva memoria para el montón (“heap”) si se utilizan variables dinámicas en el código
(2) La pila y el montón pueden tener distinto tamaño, aunque por defecto ambos tienen un tamaño de 80 bytes
(3) Para evitar sobrepasar el tamaño de la pila y del montón no se deben definir ni muchas variables ni variables muy
extensas (como arrays con muchos elementos) de forma local en una función (para la pila) o de forma dinámica (para el
montón)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.77
4. C – 4.1. Lenguaje C – 4.1.6. Reserva de memoria

─ Adicionalmente, existen distintos modificadores que alteran el tratamiento


normal de las variables, y por lo tanto la zona de memoria donde se ubican:
• static: indica que la variable debe permanecer accesible durante todo el
tiempo de ejecución del código, por lo que se ubica en la memoria del
microcontrolador independientemente de que sea local o global
• volatile: indica que la variable puede modificarse por causas ajenas al
código(1)(2), por lo que se ubica en la memoria RAM del microcontrolador
• const: indica que la variable es de sólo lectura y no se puede alterar
mediante el código, por lo que se ubica en la memoria Flash del
microcontrolador(3)

(1) Un ejemplo de este tipo de variables pueden ser las que contienen el valor de algunos registros de algunos periféricos
E/S que pueden modificar sus valores en función de eventos externos, como pueden ser los flags de interrupción
(2) La principal función de este modificador consiste en indicarle al compilador que no optimice los accesos a este tipo de
variables, ya que sus valores pueden modificarse independientemente de las instrucciones ejecutadas en el código
(3) Si se utilizan simultáneamente los modificadores volatile y const la variable no se puede alterar mediante el código
pero se ubica en la memoria RAM del microcontrolador
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.78
4. C – 4.1. Lenguaje C – 4.1.7. Rutinas de tratamiento de interrupción

4.1.7. Rutinas de tratamiento de interrupción


─ Características:
• Valor de retorno: ninguno (“void”)
• Argumentos: ninguno (“void”)
• Definición: mediante la combinación de la directiva vector seguida de la
función con la palabra clave __interrupt

#pragma vector = 0x12


__interrupt void RTI_Timer(void) {

}

#pragma vector = TIMER0_A0_VECTOR


__interrupt void RTI_Timer(void) {

}

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.79
4. C – 4.1. Lenguaje C – 4.1.8. Manipulación de bits

4.1.8. Manipulación de bits


─ Inicializar a ‘0’: [AND]

P1OUT &= ~(BIT2+BIT0);

P1OUT = P1OUT & ~(BIT2+BIT0);

P1OUT = P1OUT & ~(0x05);

P1OUT = P1OUT & (0xFA);

P1OUT X X X X X X X X

0xFA 1 1 1 1 1 0 1 0
0∙X=0
AND
1∙X=X
P1OUT X X X X X 0 X 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.80
4. C – 4.1. Lenguaje C – 4.1.8. Manipulación de bits

─ Inicializar a ‘1’: [OR]

P1OUT |= (BIT2+BIT0);

P1OUT = P1OUT | (BIT2+BIT0);

P1OUT = P1OUT | (0x05);

P1OUT X X X X X X X X

0x05 0 0 0 0 0 1 0 1
0+X=X
OR
1+X=1
P1OUT X X X X X 1 X 1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.81
4. C – 4.1. Lenguaje C – 4.1.8. Manipulación de bits

─ Conmutar: [XOR]

P1OUT ^= (BIT2+BIT0);

P1OUT = P1OUT ^ (BIT2+BIT0);

P1OUT = P1OUT ^ (0x05);

P1OUT X X X X X X X X

0x05 0 0 0 0 0 1 0 1
0+X=X
XOR
1+X=X
P1OUT X X X X X X X X

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.82
4. C – 4.1. Lenguaje C – 4.1.8. Manipulación de bits

─ Comprobar: [AND]

((P1OUT & BIT2) == 0) ((P1OUT & BIT2) != 0)

((P1OUT & 0x04) == 0) ((P1OUT & 0x04) != 0)

P1OUT X X X X X X X X

0x04 0 0 0 0 0 1 0 0
0∙X=0
AND
1∙X=X
0 0 0 0 0 X 0 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.83
4. C – 4.2. Ejemplos

4.2. Ejemplos
─ Manipulación de bytes: acceso y modificación de los bytes que forman una
palabra

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.84
4. C – 4.2. Ejemplos – 4.2.1. Manipulación de bytes

4.2.1. Manipulación de bytes


• Punteros: utilizando operaciones sobre la memoria
• Desplazamientos: utilizando operaciones a nivel de bit

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.85
4. C – 4.2. Ejemplos – 4.2.1. Manipulación de bytes – a) Punteros

a) Punteros
// Descomposición de una palabra en los bytes que la forman

unsigned int w_data; // Variable tamaño palabra (w_)


unsigned char b_lsb, b_msb; // Variables tamaño byte (b_)
unsigned char *pb_aux; // Puntero a byte (pb_)

w_data = 0x0123; // Dato -> 0x0123


pb_aux = (unsigned char *) (&w_data); // Posición de la palabra
b_lsb = *(pb_aux); // LSB (formato little endian) -> 0x23
b_msb = *(pb_aux +1); // MSB (formato little endian) -> 0x01

// Composición de una palabra con los bytes que la forman

unsigned int w_data; // Variable tamaño palabra (w_)


unsigned char b_lsb, b_msb; // Variables tamaño byte (b_)
unsigned char *pb_aux; // Puntero a byte (pb_)

b_lsb = 0x23; // LSB (formato little endian) -> 0x23


b_msb = 0x01; // MSB (formato little endian) -> 0x01
pb_aux = (unsigned char *) (&w_data); // Posición de la palabra
*(pb_aux) = b_lsb; // Dato -> 0x0123
*(pb_aux+1) = b_msb;

NOTA: Este esquema es más eficiente al utilizar únicamente accesos a memoria, aunque es dependiente de la organización
de la memoria (“little endian” o “big endian”) que utilice el microcontrolador
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.86
4. C – 4.2. Ejemplos – 4.2.1. Manipulación de bytes – b) Desplazamientos

b) Desplazamientos
// Descomposición de una palabra en los bytes que la forman

unsigned int w_data; // Variable tamaño palabra (w_)


unsigned char b_lsb, b_msb; // Variables tamaño byte (b_)

w_data = 0x0123; // Dato -> 0x0123


b_lsb = (unsigned char) (w_data); // LSB -> 0x23
b_msb = (unsigned char) (w_data >> 8); // MSB -> 0x01

// Composición de una palabra con los bytes que la forman

unsigned int w_data; // Variable tamaño palabra (w_)


unsigned char b_lsb, b_msb; // Variables tamaño byte (b_)

b_lsb = 0x23; // LSB -> 0x23


b_msb = 0x01; // MSB -> 0x01
w_data = (((unsigned int) b_msb) << 8) + // Dato -> 0x0123
((unsigned int) b_lsb);

NOTA: Este esquema es in dependiente de la organización de la memoria (“little endian” o “big endian”) que utilice el
microcontrolador, aunque es menos eficiente al utilizar operaciones de desplazamiento a nivel de bit
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.87
Índice

4.2. Ejemplos
4.2.1. Manipulación de bytes
a) Punteros
b) Desplazamientos

5. Entornos IDE
5.1. IAR
5.1.1. Estructura
a) Espacio de trabajo
b) Proyecto
5.1.2. Características
extendidas de C
a) Ficheros de cabecera
b) Manipulación de bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.88
5. Entornos IDE

5. Entornos IDE
─ El desarrollo de grandes aplicaciones en lenguaje ensamblador es altamente
complejo, por lo que suele ser imprescindible la utilización de un entorno de
desarrollo integrado o IDE (“Integrated Development Environment”) que
incorpore todas los herramientas necesarias para llevar a cabo de forma
centralizada el flujo de desarrollo software:
• Editor
• Ensamblador
• Compilador
• Enlazador
• Depurador
• Simulador
• Librerías
• Proyectos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.89
5. Entornos IDE

─ Existen diversos entornos de desarrollo para la familia MSP430 de Texas


Instruments, siendo los más importantes:
• Code Composer Studio
• IAR Embedded Workbench
• MSPGCC

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.90
5. Entornos IDE – 5.1. IAR

5.1. IAR
─ El entorno de desarrollo IAR Embedded Workbench dispone de numerosas
facilidades para llevar a cabo la edición y depuración de cualquier aplicación:
• Estructura
• Características extendidas de C

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.91
5. Entornos IDE – 5.1. IAR – 5.1.1. Estructura

5.1.1. Estructura
─ El entorno de desarrollo IAR Embedded Workbench organiza las aplicaciones a
implementar en una estructura jerárquica:
• Espacios de trabajo
• Proyecto

Espacio de trabajo

Proyectos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.92
5. Entornos IDE – 5.1. IAR – 5.1.1. Estructura – a) Espacio de trabajo

a) Espacio de trabajo
─ Un espacio de trabajo (“Workspace”) constituye la entidad de mayor jerarquía,
y permite agrupar a todos aquellos proyectos relacionados entre sí en la
implementación de una determinada aplicación

Espacio de trabajo

Proyectos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.93
5. Entornos IDE – 5.1. IAR – 5.1.1. Estructura – b) Proyecto

b) Proyecto
─ Un proyecto (“Project”) constituye la entidad que permite agrupar a todos
aquellos módulos de código fuente que se realizan conjuntamente para
desarrollar un determinado programa, los cuales serán ensamblados/compilados
y enlazados conjuntamente para generar el código ejecutable
─ Cada proyecto tiene sus propias opciones de configuración, entra las cuales
se encuentra por ejemplo el microcontrolador para el que se desarrolla el código

Proyecto

Código fuente

Código fuente

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.94
5. Entornos IDE – 5.1. IAR – 5.1.2. Características extendidas de C

5.1.2. Características extendidas de C


─ El entorno de desarrollo IAR Embedded Workbench posee algunas
características adicionales para ampliar la capacidad de desarrollo de código
para microcontroladores en lenguaje C:
• Ficheros de cabecera: fichero de cabecera “io430g2533.h”
• Manipulación de bits: estructura de datos extendida para manipular bits

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.95
5. Entornos IDE – 5.1. IAR – 5.1.2. Características extendidas de C – a) Ficheros de cabecera

a) Ficheros de cabecera
─ El fichero de cabecera “io430g2533.h” incorpora todas las características del
fichero de cabecera “msp430g2533.h”(1), y adicionalmente define nuevas
estructuras de datos para operar más fácilmente con cada uno de los registros:

Fichero de cabecera

Estructura de datos extendida


disponible para cada uno de
los registros

(1) En el código únicamente se puede incluir uno de estos ficheros de cabecera: “msp430g2533.h” o “io430g2533.h”
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.96
5. Entornos IDE – 5.1. IAR – 5.1.2. Características extendidas de C – a) Ficheros de cabecera

Variable P1OUT de tamaño


byte que permite acceder al
contenido completo del P1OUT
registro P1OUT
1 byte (8 bits)

8 bits (1 byte)
Estructura P1OUT_bit de
campo de bits (“bitfields”) que P7 P6 P5 P4 P3 P2 P1 P0
permite acceder al contenido
de cada bit del registro P1OUT

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.97
5. Entornos IDE – 5.1. IAR – 5.1.2. Características extendidas de C – a) Ficheros de cabecera

Unión(1) de la variable P1OUT


de tamaño byte y de la
estructura P1OUT_bit de
campo de bits

P1OUT
P7 P6 P5 P4 P3 P2 P1 P0

1 byte = 8 bits

(1) Una unión es una agrupación de variables que comparten la misma zona de memoria, por lo que el acceso a la misma se
puede realizar mediante cualquiera de las variables que la forman. Las variables que comparten la zona de memoria se
conocen como miembros de la unión, y el tamaño de la zona de memoria ocupada por una unión es siempre igual al
tamaño del mayor de sus miembros
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.98
5. Entornos IDE – 5.1. IAR – 5.1.2. Características extendidas de C – a) Ficheros de cabecera

P1OUT  accede al contenido


completo del registro P1OUT P1OUT

P1OUT
P7 P6 P5 P4 P3 P2 P1 P0

P1OUT_bit.PX  accede al bit P7 P6 P5 P4 P3 P2 P1 P0


PX del registro P1OUT

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.99
5. Entornos IDE – 5.1. IAR – 5.1.2. Características extendidas de C – b) Manipulación de bits

b) Manipulación de bits
─ Con las nuevas estructuras de datos definidas en el fichero de cabecera
“io430g2533.h” el acceso a los registros a nivel de bit se simplifica
enormemente:
• Inicializar a ‘0’ : P1OUT_bit.P0 = P1OUT_bit.P2 = 0;
• Inicializar a ‘1’ : P1OUT_bit.P0 = P1OUT_bit.P2 = 1;
• Conmutar : P1OUT_bit.P0 = ~(P1OUT_bit.P0);
P1OUT_bit.P2 = ~(P1OUT_bit.P2);
• Comprobar : (P1OUT_bit.P2 == 0)
(P1OUT_bit.P2 != 0)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T3.100
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Ejercicios Tema 3:
Programación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.0
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.1
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.2
1. Enunciados – Ejercicio 1

Ejercicio 1:
─ Se representa a continuación el mapa de memoria del microcontrolador
MSP430G2533:
0xFFFF Vectores
Flash 64 B
0xFFC0 Interrupción

0xFFBF

Flash Código 16 KB

0xC000

NO UTILIZADA

0x10FF Información
Flash 256 B 64 KB
0x1000 Calibración

NO UTILIZADA

0x03FF
RAM Datos 512 B
0x0200
0x01FF
Periféricos 16 bits 256 B
0x0100

0x00FF
Periféricos 8 bits 240 B
0x0010
0x000F
Registros especiales 16 B
0x0000

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.3
1. Enunciados – Ejercicio 1

─ Utilizando el fichero de cabecera “msp430g2533.h” responder a las siguientes


cuestiones:
a) Indicar cuales son los registros especiales del microcontrolador y sus
correspondientes direcciones en el mapa de memoria
b) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 8 bits de los periféricos del microcontrolador
c) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 16 bits de los periféricos del microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.4
1. Enunciados – Ejercicio 2

Ejercicio 2:
─ Utilizando el fichero de cabecera “msp430g2533.h”, indicar el valor de las
siguientes constantes en binario, decimal y hexadecimal:
• BIT9+BIT3+BIT2+BIT0
• LPM3
• TASSEL_2+ID_3+MC_1+TAIE

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.5
1. Enunciados – Ejercicio 3

Ejercicio 3:
─ El Watchdog se deshabilita con la instrucción:
MOV.W #WDTPW+WDTHOLD,&WDTCTL
a) Utilizando el fichero de cabecera “msp430g2533.h”, indicar el valor de los
operandos de dicha instrucción en binario, decimal y hexadecimal

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.6
1. Enunciados – Ejercicio 4

Ejercicio 4:
─ Se dispone del siguiente código fuente en lenguaje ensamblador:
ORG 0x0200

var1 DC16 0
var2 DS16 0
var3 DC16 1
var4 DS16 1
var5 DC8 2
var6 DC16 3
a) Indicar el valor de todas las etiquetas del código
b) Indicar el valor de todas las variables del código
c) En el código fuente existe un error. Indicar cual es el error y proponer dos
formas distintas de solucionarlo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.7
1. Enunciados – Ejercicio 5

Ejercicio 5:
─ Se dispone del siguiente código fuente en lenguaje ensamblador:
ORG 0xC000

Main MOV.W #WDTPW+WDTHOLD,&WDTCTL


Label1 MOV.W #0x0400,SP
CONT EQU 100
Label2 MOV.W #CONT,R10
Label3 SUB.W #5,R10
END
Label4 JNZ Label3
Label5 JMP Label5
a) Indicar el valor de todas las etiquetas del código
b) Indicar el valor final del registro R10
c) Indicar la instrucción que ejecutará el microcontrolador después de:
SUB.W #5,R10

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.8
1. Enunciados – Ejercicio 6

Ejercicio 6:
─ Con la información contenida en el fichero de cabecera “io430g2533.h” indicar el
número de vector a especificar en la directiva #pragma vector = <N> para
cada una de las rutinas de tratamiento de interrupción disponibles en el
“MSP430G2533”

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.9
1. Enunciados – Ejercicio 7

Ejercicio 7:
─ Se dispone de una variable tipo byte denominada flags, y se quiere, con una
única instrucción, realizar las siguientes operaciones sobre ella:
• Inicializar a ‘0’ los bits 0 y 3
• Inicializar a ‘1’ los bits 1, 4 y 7
• Conmutar los bits 2 y 5
a) Indicar la instrucción a ejecutar para realizar las operaciones deseadas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.10
1. Enunciados – Ejercicio 8

Ejercicio 8:
─ Se dispone de un compilador con distintos niveles de optimización, el cual se
utiliza para compilar el siguiente código fuente en lenguaje C:
#include "io430g2533.h"

int main(void) {

unsigned char *ptr_p1ifg; // Puntero a P1IFG

ptr_p1ifg = (unsigned char *) 0x0023; // P1IFG -> 0x0023


*ptr_p1ifg = 0; // P1IFG = 0x00

while ((*ptr_p1ifg & 0x08) == 0) { // P1IFG.BIT3 == 0?


}

… // P1IFG.BIT3 = 1

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.11
1. Enunciados – Ejercicio 8

─ Sin utilizar ningún nivel de optimización del compilador se obtiene el siguiente


código fuente en lenguaje ensamblador:
main: MOV.W #0x23, R15
MOV.B #0x0, 0(R15)
??main_0: BIT.B #0x8, 0(R15)
JNC ??main_0

a) Indicar si el código fuente en lenguaje ensamblador tiene la misma
funcionalidad que el código fuente en lenguaje C
b) En caso de no tener la misma funcionalidad, indicar la causa de tal
circunstancia
c) En caso de no tener la misma funcionalidad, indicar una posible solución
para tal circunstancia

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.12
1. Enunciados – Ejercicio 8

─ Utilizando el mayor nivel de optimización del compilador se obtiene el siguiente


código fuente en lenguaje ensamblador:
main: MOV.B #0x0, &0x23
??main_0: JMP ??main_0

a) Indicar si el código fuente en lenguaje ensamblador tiene la misma
funcionalidad que el código fuente en lenguaje C
b) En caso de no tener la misma funcionalidad, indicar la causa de tal
circunstancia
c) En caso de no tener la misma funcionalidad, indicar una posible solución
para tal circunstancia

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.13
1. Enunciados – Ejercicio 9

Ejercicio 9:
─ Se desea crear una estructura de datos de tamaño palabra similar a la
estructura de datos extendida que define el fichero de cabecera “io430g2533.h”,
la cual utiliza uniones para permitir el acceso completo o a nivel de bits a los
distintos registros del mapa de memoria. Esta nueva estructura debe permitir:
• Acceder a la palabra
• Acceder a los bytes MSB y LSB de la palabra
• Acceder a los bits MSb y LSb de la palabra
• Acceder a los bits de la palabra

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.14
1. Enunciados – Ejercicio 9

a) Definir la estructura y crear una variable flags con dicha estructura


b) Realizar las siguientes operaciones e indicar el valor de la variable flags:
- Inicializar a ‘0xCD’ el byte LSB
- Inicializar a ‘1’ el bit MSb
- Inicializar a ‘0’ los bits 10, 12 y 14
- Inicializar a ‘1’ los bits 8, 9, 11 y 13

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.15
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.16
2. Solución – Ejercicio 1

Ejercicio 1:
a) Indicar cuales son los registros especiales del microcontrolador y sus
correspondientes direcciones en el mapa de memoria
b) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 8 bits de los periféricos del microcontrolador
c) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 16 bits de los periféricos del microcontrolador

IE1 0x0000
IE2 0x0001
IFG1 0x0002
IFG2 0x0003

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.17
2. Solución – Ejercicio 1

a) Indicar cuales son los registros especiales del microcontrolador y sus


correspondientes direcciones en el mapa de memoria
b) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 8 bits de los periféricos del microcontrolador
c) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 16 bits de los periféricos del microcontrolador

P3REN 0x0010 P1IE 0x0025 P2REN 0x002F


P3IN 0x0018 P1SEL 0x0026 P1SEL2 0x0041
P3OUT 0x0019 P1REN 0x0027 P2SEL2 0x0042
P3DIR 0x001A P2IN 0x0028 P3SEL2 0x0043
P3SEL 0x001B P2OUT 0x0029 ADC10DTC0 0x0048
P1IN 0x0020 P2DIR 0x002A ADC10DTC1 0x0049
P1OUT 0x0021 P2IFG 0x002B ADC10AE0 0x004A
P1DIR 0x0022 P2IES 0x002C BCSCTL3 0x0053
P1IFG 0x0023 P2IE 0x002D DCOCTL 0x0056
P1IES 0x0024 P2SEL 0x002E BCSCTL1 0x0057

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.18
2. Solución – Ejercicio 1

a) Indicar cuales son los registros especiales del microcontrolador y sus


correspondientes direcciones en el mapa de memoria
b) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 8 bits de los periféricos del microcontrolador
c) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 16 bits de los periféricos del microcontrolador

BCSCTL2 0x0058 UCA0RXBUF 0x0066


UCA0ABCTL 0x005D UCA0TXBUF 0x0067
UCA0IRTCTL 0x005E UCB0CTL0 0x0068
UCA0IRRCTL 0x005F UCB0CTL1 0x0069
UCA0CTL0 0x0060 UCB0BR0 0x006A
UCA0CTL1 0x0061 UCB0BR1 0x006B
UCA0BR0 0x0062 UCB0I2CIE 0x006C
UCA0BR1 0x0063 UCB0STAT 0x006D
UCA0MCTL 0x0064 UCB0RXBUF 0x006E
UCA0STAT 0x0065 UCB0TXBUF 0x006F

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.19
2. Solución – Ejercicio 1

a) Indicar cuales son los registros especiales del microcontrolador y sus


correspondientes direcciones en el mapa de memoria
b) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 8 bits de los periféricos del microcontrolador
c) Indicar cuales son las direcciones en el mapa de memoria de los registros
de configuración de 16 bits de los periféricos del microcontrolador

UCB0I2COA 0x0118 TA0CCTL1 0x0164 TA1R 0x0190


UCB0I2CSA 0x011A TA0CCTL2 0x0166 TA1CCR0 0x0192
TA1IV 0x011E TA0R 0x0170 TA1CCR1 0x0194
WDTCTL 0x0120 TA0CCR0 0x0172 TA1CCR2 0x0196
FCTL1 0x0128 TA0CCR1 0x0174 ADC10CTL0 0x01B0
FCTL2 0x012A TA0CCR2 0x0176 ADC10CTL1 0x01B2
FCTL3 0x012C TA1CTL 0x0180 ADC10MEM 0x01B4
TA0IV 0x012E TA1CCTL0 0x0182 ADC10SA 0x01BC
TA0CTL 0x0160 TA1CCTL1 0x0184
TA0CCTL0 0x0162 TA1CCTL2 0x0186

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.20
2. Solución – Ejercicio 2

Ejercicio 2:
• BIT9+BIT3+BIT2+BIT0
0000001000001101 525 0x020D
• LPM3
0000000011010000 208 0x00D0
• TASSEL_2+ID_3+MC_1+TAIE
0000001011010010 722 0x02D2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.21
2. Solución – Ejercicio 3

Ejercicio 3:
• MOV.W #WDTPW+WDTHOLD,&WDTCTL
MOV.W #0101101010000000,&0000000100100000
MOV.W #23168,&288
MOV.W #0x5A80,&0x0120

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.22
2. Solución – Ejercicio 4

Ejercicio 4:
a) Indicar el valor de todas las etiquetas del código
b) Indicar el valor de todas las variables del código
c) En el código fuente existe un error. Indicar cual es el error y proponer dos
formas distintas de solucionarlo

var1 0x0200
var2 0x0202
var3 0x0202
var4 0x0204
var5 0x0206
var6 0x0207

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.23
2. Solución – Ejercicio 4

a) Indicar el valor de todas las etiquetas del código


b) Indicar el valor de todas las variables del código
c) En el código fuente existe un error. Indicar cual es el error y proponer dos
formas distintas de solucionarlo

var1 0x0000
var2 0x0001
var3 0x0001
var4 0x????
var5 0x02
var6 0x0302

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.24
2. Solución – Ejercicio 4

a) Indicar el valor de todas las etiquetas del código


b) Indicar el valor de todas las variables del código
c) En el código fuente existe un error. Indicar cual es el error y proponer dos
formas distintas de solucionarlo

ERROR: la variable de tamaño palabra “var6” se encuentra en la dirección


impar “0x0207”. Posibles soluciones para corregir este error:

ORG 0x0200 ORG 0x0200

var1 DC16 0 var1 DC16 0


var2 DS16 0 var2 DS16 0
var3 DC16 1 var3 DC16 1
var4 DS16 1 var4 DS16 1
var6 DC16 3 var5 DC8 2
var5 DC8 2 EVEN
var6 DC16 3

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.25
2. Solución – Ejercicio 5

Ejercicio 5:
a) Indicar el valor de todas las etiquetas del código
b) Indicar el valor final del registro R10
c) Indicar la instrucción que ejecutará el microcontrolador después de:
SUB.W #5,R10

Main 0xC000
Label1 0xC006
Label2 0xC00A
Label3 0xC00E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.26
2. Solución – Ejercicio 5

a) Indicar el valor de todas las etiquetas del código


b) Indicar el valor final del registro R10
c) Indicar la instrucción que ejecutará el microcontrolador después de:
SUB.W #5,R10

R10 95

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.27
2. Solución – Ejercicio 5

a) Indicar el valor de todas las etiquetas del código


b) Indicar el valor final del registro R10
c) Indicar la instrucción que ejecutará el microcontrolador después de:
SUB.W #5,R10

La instrucción que se encuentre en la dirección “0xC012”, la cual contendrá


datos que pueden no corresponderse con ninguna instrucción válida del
microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.28
2. Solución – Ejercicio 6

Ejercicio 6:

RESET_VECTOR 30 = 0x1E
NMI_VECTOR 28 = 0x1C
TIMER1_A0_VECTOR 26 = 0x1A
TIMER1_A1_VECTOR 24 = 0x18
WDT_VECTOR 20 = 0x14
TIMER0_A0_VECTOR 18 = 0x12
TIMER0_A1_VECTOR 16 = 0x10
USCIAB0RX_VECTOR 14 = 0x0E
USCIAB0TX_VECTOR 12 = 0x0C
ADC10_VECTOR 10 = 0x0A
PORT2_VECTOR 06 = 0x06
PORT1_VECTOR 04 = 0x04

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.29
2. Solución – Ejercicio 7

Ejercicio 7:
a) Indicar la instrucción a ejecutar para realizar las operaciones deseadas

flags=(((flags&~(BIT3+BIT0))|(BIT7+BIT4+BIT1))^(BIT5+BIT2));

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.30
2. Solución – Ejercicio 8

Ejercicio 8:
─ Sin utilizar ningún nivel de optimización del compilador:
a) Indicar si el código fuente en lenguaje ensamblador tiene la misma
funcionalidad que el código fuente en lenguaje C
b) En caso de no tener la misma funcionalidad, indicar la causa de tal
circunstancia
c) En caso de no tener la misma funcionalidad, indicar una posible solución
para tal circunstancia

Sí, ambos códigos tienen la misma funcionalidad (esperar a que se active el


flag de interrupción correspondiente al pin 3 del puerto 1 antes de continuar la
ejecución del código)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.31
2. Solución – Ejercicio 8

─ Utilizando el mayor nivel de optimización del compilador:


a) Indicar si el código fuente en lenguaje ensamblador tiene la misma
funcionalidad que el código fuente en lenguaje C
b) En caso de no tener la misma funcionalidad, indicar la causa de tal
circunstancia
c) En caso de no tener la misma funcionalidad, indicar una posible solución
para tal circunstancia
No, ambos códigos no tienen la misma funcionalidad (el código fuente en
lenguaje C espera a que se active el flag de interrupción correspondiente al
pin 3 del puerto 1 antes de continuar la ejecución del código, mientras que el
código fuente en lenguaje ensamblador se bloquea)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.32
2. Solución – Ejercicio 8

─ Utilizando el mayor nivel de optimización del compilador:


a) Indicar si el código fuente en lenguaje ensamblador tiene la misma
funcionalidad que el código fuente en lenguaje C
b) En caso de no tener la misma funcionalidad, indicar la causa de tal
circunstancia
c) En caso de no tener la misma funcionalidad, indicar una posible solución
para tal circunstancia
Al utilizar el mayor nivel de optimización del compilador, este analiza el código
para reducir los accesos a memoria. Al inicializarse a ‘0’ la variable
*ptr_p1ifg y no modificar su valor en el resto del código, la condición
((*ptr_p1ifg & 0x08) == 0) siempre se cumple, por lo que el
compilador elimina dicha comparación del código para evitar acceder a la
variable *ptr_p1ifg

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.33
2. Solución – Ejercicio 8

─ Utilizando el mayor nivel de optimización del compilador:


a) Indicar si el código fuente en lenguaje ensamblador tiene la misma
funcionalidad que el código fuente en lenguaje C
b) En caso de no tener la misma funcionalidad, indicar la causa de tal
circunstancia
c) En caso de no tener la misma funcionalidad, indicar una posible solución
para tal circunstancia
Una solución consiste en utilizar el modificador volatile al definir la variable:
volatile char *ptr_p1ifg;
el cual le indica al compilador que dicha variable puede modificar su valor
independientemente del código ejecutado, por lo que no debe optimizar los
accesos a la misma haciendo suposiciones del valor que almacena

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.34
2. Solución – Ejercicio 9

Ejercicio 9:
a) Definir la estructura y crear una variable flags con dicha estructura
b) Realizar las siguientes operaciones e indicar el valor de la variable flags:
union {
unsigned int word;
struct {
unsigned char LSB;
unsigned char MSB;
};
struct {
unsigned int LSb :1;
unsigned int unused_1 :14;
unsigned int MSb :1;
};
struct {
unsigned int B0 :1;
unsigned int B1 :1;
unsigned int B2 :1;
unsigned int B3 :1;
unsigned int B4 :1;
unsigned int B5 :1;
unsigned int B6 :1;
unsigned int B7 :1;
unsigned int B8 :1;
unsigned int B9 :1;
unsigned int B10 :1;
unsigned int B11 :1;
unsigned int B12 :1;
unsigned int B13 :1;
unsigned int B14 :1;
unsigned int B15 :1;
};
} flags;

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.35
2. Solución – Ejercicio 9

a) Definir la estructura y crear una variable flags con dicha estructura


b) Realizar las siguientes operaciones e indicar el valor de la variable flags:
- Inicializar a ‘0xCD’ el byte LSB
- Inicializar a ‘1’ el bit MSb
- Inicializar a ‘0’ los bits 10, 12 y 14
- Inicializar a ‘1’ los bits 8, 9, 11 y 13
flags.LSB = 0xCD;
flags.MSb = 1;
flags.B10 = flags.B12 = flags.B14 = 0;
flags.B8 = flags.B9 = flags.B11 = flags.B13 = 1;

flags 0xABCD

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET3.36
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 4:
Hardware básico

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.0
Índice

1. Introducción 3.4. Esquema completo


2. Reset 4. Módulo de reloj
2.1. Tipos de reset 4.1. Estructura
2.1.1. POR (Power-On Reset) 4.2. Fuentes de reloj
2.1.2. PUC (Power-Up Clear) 4.2.1. VLOCLK
2.2. Estado del 4.2.2. LFXT1CLK
microcontrolador 4.2.3. DCOCLK
4.3. Señales de reloj
3. Interrupciones
4.3.1. ACLK
3.1. Tipos de interrupciones 4.3.2. MCLK
3.1.1. Reset 4.3.3. SMCLK
3.1.2. (No) enmascarables
4.4. Registros de
3.1.3. Enmascarables
configuración
3.2. Procesamiento
3.2.1. Tratamiento de la 5. Bajo consumo
interrupción 5.1. Modos de operación
3.2.2. Retorno de la
interrupción
5.2. Cambio del modo de
operación
3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.1
Índice

1. Introducción 3.4. Esquema completo


2. Reset 4. Módulo de reloj
2.1. Tipos de reset 4.1. Estructura
2.1.1. POR (Power-On Reset) 4.2. Fuentes de reloj
2.1.2. PUC (Power-Up Clear) 4.2.1. VLOCLK
2.2. Estado del 4.2.2. LFXT1CLK
microcontrolador 4.2.3. DCOCLK
4.3. Señales de reloj
3. Interrupciones
4.3.1. ACLK
3.1. Tipos de interrupciones 4.3.2. MCLK
3.1.1. Reset 4.3.3. SMCLK
3.1.2. (No) enmascarables
4.4. Registros de
3.1.3. Enmascarables
configuración
3.2. Procesamiento
3.2.1. Tratamiento de la 5. Bajo consumo
interrupción 5.1. Modos de operación
3.2.2. Retorno de la
interrupción
5.2. Cambio del modo de
operación
3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.2
1. Introducción

1. Introducción
─ Los microcontroladores de la familia MSP430 disponen de diversos recursos
básicos para poder operar adecuadamente:
• Reset: determina el estado inicial del microcontrolador
• Interrupciones: sistema de gestión de eventos que requieren la
intervención inmediata de la CPU
• Módulo de reloj: esquema de generación de las distintas señales del reloj
que gestionan la operación del microcontrolador
• Bajo consumo: establecimiento del conjunto de relojes activos para permitir
la desactivación selectiva de los recursos no utilizados y reducir el consumo
del microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.3
Índice

1. Introducción 3.4. Esquema completo


2. Reset 4. Módulo de reloj
2.1. Tipos de reset 4.1. Estructura
2.1.1. POR (Power-On Reset) 4.2. Fuentes de reloj
2.1.2. PUC (Power-Up Clear) 4.2.1. VLOCLK
2.2. Estado del 4.2.2. LFXT1CLK
microcontrolador 4.2.3. DCOCLK
4.3. Señales de reloj
3. Interrupciones
4.3.1. ACLK
3.1. Tipos de interrupciones 4.3.2. MCLK
3.1.1. Reset 4.3.3. SMCLK
3.1.2. (No) enmascarables
4.4. Registros de
3.1.3. Enmascarables
configuración
3.2. Procesamiento
3.2.1. Tratamiento de la 5. Bajo consumo
interrupción 5.1. Modos de operación
3.2.2. Retorno de la
interrupción
5.2. Cambio del modo de
operación
3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.4
2. Reset

2. Reset
─ Permite introducir al microcontrolador en un estado inicial conocido

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.5
2. Reset – 2.1. Tipos de reset

2.1. Tipos de reset


─ En la familia MSP430 existen dos tipos de reset:
• POR (“Power-On Reset”): asociado a aspectos hardware
• PUC (“Power-Up Clear”): asociado a aspectos software

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.6
2. Reset – 2.1. Tipos de reset – 2.1.1. POR (Power-On Reset)

2.1.1. POR (Power-On Reset)


─ Las principales causas por las que se genera este tipo de reset son:
• Encendido del dispositivo
• Un nivel bajo en el pin RST/NMI(1) cuando está configurado en modo reset(2)

(1) Útil para conectar un pulsador en el pin RST/NMI que permita realizar un reset del microcontrolador
(2) La funcionalidad del pin RST/NMI se configura en el bit WDTNMI del registro WDTCTL
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.7
2. Reset – 2.1. Tipos de reset – 2.1.2. PUC (Power-Up Clear)

2.1.2. PUC (Power-Up Clear)


─ Las principales causas por las que se genera este tipo de reset son:
• Generación de un reset de tipo POR
• Expiración del tiempo del watchdog
• Violación de la clave de seguridad(1) del watchdog
• Violación de la clave de seguridad(1) de la flash
• Intento de ejecución de alguna instrucción cuya dirección se encuentre en el
rango 0x0000 – 0x01FF (2) o en una zona no utilizada del mapa de memoria

(1) Una clave de seguridad es un valor determinado que hay que introducir en ciertos bits de un registro para poder operar
con el periférico asociado a dicho registro. Sirve para evitar efectos indeseados al escribir accidentalmente en registros
que controlan periféricos críticos del microcontrolador
(2) En este rango de direcciones se encuentran los registros especiales de la CPU y los registros de configuración de los
periféricos de 8 y 16 bits
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.8
2. Reset – 2.1. Tipos de reset – 2.2. Estado del microcontrolador

2.2. Estado del microcontrolador


─ Tras un reset (POR/PUC) el microcontrolador se sitúa en el siguiente estado:
• El pin RST/NMI se configura en modo reset
• Los pines de los puertos E/S se configuran en modo entrada
• Los bits del registro de estado SR se inicializan a ‘0’
• El watchdog se configura en modo watchdog(1)
• El contador de programa PC se inicializa al valor almacenado en la dirección
0xFFFE, que se corresponde con el vector de interrupción de la rutina reset.
Si el valor almacenado en dicha dirección es 0xFFFF se entiende que no ha
sido inicializado, por lo que el microcontrolador entra en bajo consumo

(1) Inicialmente el watchdog se configura con un período de aproximadamente 30 ms


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.9
2. Reset – 2.1. Tipos de reset – 2.1.3. Estado del microcontrolador

• Los registros de la CPU y de los periféricos se inicializan a su valor por


defecto(1), según indique la documentación correspondiente(2):

(1) Normalmente los flags de interrupción de los registros se suelen inicializar a ‘0’, por lo que se anulan las posibles
interrupciones que quedasen pendientes de ser atendidas
(2) La única diferencia en el estado del microcontrolador tras un reset POR y un reset PUC se encuentra en el valor por
defecto al que se inicializan los distintos registros
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.10
Índice

1. Introducción 3.4. Esquema completo


2. Reset 4. Módulo de reloj
2.1. Tipos de reset 4.1. Estructura
2.1.1. POR (Power-On Reset) 4.2. Fuentes de reloj
2.1.2. PUC (Power-Up Clear) 4.2.1. VLOCLK
2.2. Estado del 4.2.2. LFXT1CLK
microcontrolador 4.2.3. DCOCLK
4.3. Señales de reloj
3. Interrupciones
4.3.1. ACLK
3.1. Tipos de interrupciones 4.3.2. MCLK
3.1.1. Reset 4.3.3. SMCLK
3.1.2. (No) enmascarables
4.4. Registros de
3.1.3. Enmascarables
configuración
3.2. Procesamiento
3.2.1. Tratamiento de la 5. Bajo consumo
interrupción 5.1. Modos de operación
3.2.2. Retorno de la
interrupción
5.2. Cambio del modo de
operación
3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.11
3. Interrupciones

3. Interrupciones
─ Permiten detectar la ocurrencia de distintos eventos asíncronos respecto a la
ejecución del programa, los cuales requieren un procesamiento rápido e
inmediato por parte de la CPU

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.12
3. Interrupciones

─ Sondeo: consulta periódica del estado de los periféricos para detectar la


ocurrencia de eventos en los mismos (como por ejemplo, consecuencia de las
acciones producidas en el mundo exterior)
 Ineficiencia
 Retardo
μC

Memoria
Sondeo
CPU
Periféricos Evento
E/S

Buses

Acción
Mundo
Exterior

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.13
3. Interrupciones

─ Interrupción: detección automática de la ocurrencia de eventos en los


periféricos (como por ejemplo, consecuencia de las acciones producidas en el
mundo exterior)
 Eficiencia
 Rapidez
μC

Memoria
Interrupción
CPU
Periféricos Evento
E/S

Buses

Acción
Mundo
Exterior

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.14
3. Interrupciones

─ Características:
• Interrupción: mecanismo disponible en el microcontrolador para detectar y
atender distintos eventos
• Origen: a los eventos asociados a una interrupción se les denomina
fuentes(1) de la interrupción
• Eventos: se pueden detectar los siguientes tipos de eventos:
- Internos: generados por los propios recursos del microcontrolador
(watchdog, temporizadores, fallo en los osciladores externos, cortes en
la alimentación…)
- Externos: generados por acciones determinadas sobre los periféricos
E/S (cambios en los pines de los puertos E/S, datos recibidos por los
periféricos de comunicaciones, generación de un reset externo…)

(1) Una interrupción puede tener una o varias fuentes (eventos) asociadas
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.15
3. Interrupciones

• Activación: cuando se detecta la ocurrencia de un evento asociado a una


interrupción se activa su correspondiente flag de interrupción(1), indicando
que el evento está pendiente de ser atendido mediante dicha interrupción

• Habilitación: para que la ocurrencia de un evento genere una interrupción


que lo pueda atender es necesario que dicha interrupción esté habilitada,
para lo que se utilizan bits de habilitación(1)

• Prioridad: cada interrupción posee una prioridad, y en el caso de que


existan pendientes varias interrupciones siempre se atiende en primer lugar
la de mayor prioridad, quedando el resto de interrupciones pendientes para
ser atendidas cuando finalice la más prioritaria
(1) Los flags de interrupción y los bits de habilitación se pueden localizar en los registros especiales de la CPU, en el registro
de estado SR (bit GIE) y en los propios registros de configuración de los periféricos
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.16
3. Interrupciones – 3.1. Tipos de interrupciones

3.1. Tipos de interrupciones


─ En función de la capacidad para habilitar o deshabilitar cada interrupción se
pueden distinguir tres tipos de interrupciones:
• Reset: no se pueden deshabilitar
• (No) enmascarables: se pueden habilitar o deshabilitar únicamente
mediante los bits de habilitación específicos del registro especial IE1 de la
CPU
• Enmascarables: se pueden habilitar o deshabilitar utilizando el bit de
habilitación general GIE del registro de estado SR y los bits de habilitación
específicos de los registros de configuración de cada periférico

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.17
3. Interrupciones – 3.1. Tipos de interrupciones – 3.1.1. Reset

3.1.1. Reset
─ Interrupciones asociadas al reset del sistema, las cuales pueden ser generadas
por las siguientes fuentes:
• Encendido del dispositivo
POR
• Un nivel bajo en el pin RST/NMI cuando está configurado en modo reset
• Expiración del tiempo del watchdog
• Violación de la clave de seguridad del watchdog
PUC
• Violación de la clave de seguridad de la flash
• Intento de ejecución de alguna instrucción cuya dirección se encuentre en el
rango 0x0000 – 0x01FF o en una zona no utilizada del mapa de memoria
─ No se pueden deshabilitar

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.18
3. Interrupciones – 3.1. Tipos de interrupciones – 3.1.2. (No) enmascarables

3.1.2. (No) enmascarables


─ Interrupciones asociadas a fallos especiales del microcontrolador, las cuales
pueden ser generadas por las siguientes fuentes:
• Un flanco activo(1) en el pin RST/NMI cuando está configurado en modo
interrupción
• Fallo en los osciladores externos
• Violación de acceso a la flash(2)
─ Se pueden habilitar o deshabilitar únicamente mediante los bits de habilitación
específicos del registro especial IE1 de la CPU (ACCVIE, NMIIE y OFIE)

─ Tras generarse una interrupción (no) enmascarable los bits de habilitación


específicos del registro especial IE1 de la CPU (ACCVIE, NMIIE y OFIE) se
inicializan a ‘0’, por lo que es necesario volver a activarlos si se quieren habilitar
las correspondientes interrupciones

(1) El flanco activo del pin RST/NMI se configura en el bit WDTNMIES del registro WDTCTL
(2) Se produce una violación de acceso a la flash cuando se intenta acceder a la misma mientras se está programando
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.19
3. Interrupciones – 3.1. Tipos de interrupciones – 3.1.3. Enmascarables

3.1.3. Enmascarables
─ Interrupciones asociadas a los periféricos E/S(1)
─ Se pueden deshabilitar mediante el bit de habilitación general GIE del registro
de estado SR o mediante los bits de habilitación específicos de los registros de
configuración de cada periférico

─ Para que la interrupción correspondiente al periférico esté habilitada es


necesario que ambos bits (bit de habilitación general GIE y bit de habilitación
específico) se encuentren activos

(1) Un periférico E/S puede tener varias interrupciones asociadas


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.20
3. Interrupciones – 3.2. Procesamiento

3.2. Procesamiento
─ Al generarse una interrupción se detiene la ejecución del programa en curso y
se ejecuta una rutina de código asociada a la interrupción conocida como RTI
(Rutina de Tratamiento de Interrupción) o ISR (Interrupt Service Routine)
─ Tras finalizar la ejecución de la RTI(1) el programa continúa su ejecución

Interrupción
RTI

Programa

(1) La ejecución de la RTI finaliza con la instrucción: RETI


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.21
3. Interrupciones – 3.2. Procesamiento – 3.2.1. Tratamiento de la interrupción

3.2.1. Tratamiento de la interrupción


─ Cuando se genera una interrupción se ejecuta la siguiente secuencia(1) para
realizar su tratamiento:
1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa,
o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a
ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila(2)

(1) El tiempo que tarda esta secuencia en ejecutarse es de 6 ciclos de reloj


(2) Este comportamiento implica que se almacena el estado actual de la CPU: activa o bajo consumo (bits SCG1, SCG0,
OSCOFF, CPUOFF), habilitación de las interrupciones enmascarables (bit GIE), flags de estado (bits V, N, Z, C)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.22
3. Interrupciones – 3.2. Procesamiento – 3.2.1. Tratamiento de la interrupción

4. Si existen múltiples interrupciones pendientes se escoge la de mayor


prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de
interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas(1)
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en
bajo consumo y deshabilitando las interrupciones enmascarables(2)

7. El contenido del vector de interrupción(3) asociado a la misma se carga en


el contador de programa PC, comenzando la ejecución de la RTI

(1) En tal caso debe ser el programador el responsable de comprobar cuál es la fuente de la interrupción e inicializar el flag
de interrupción correspondiente a la misma a ‘0’
(2) Este comportamiento implica que una interrupción no puede ser interrumpida por otra durante su ejecución. Si se desea
alterar este comportamiento y permitir interrupciones anidadas hay que habilitar el bit GIE del registro SR en la propia
RTI, por lo que cualquier nueva interrupción que se genere interrumpirá la RTI que se esté ejecutando
(independientemente de las prioridades de ambas interrupciones)
(3) El vector de interrupción es un puntero que indica la dirección donde comienza la RTI
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.23
3. Interrupciones – 3.2. Procesamiento – 3.2.2. Retorno de la interrupción

3.2.2. Retorno de la interrupción


─ Cuando finaliza la ejecución de la RTI se ejecuta la siguiente secuencia(1) para
reanudar la ejecución del programa:
1. Se restaura el registro de estado SR con el almacenado en la pila(2)
2. Se restaura el contador de programa PC con el almacenado en la pila (que
apunta a la siguiente instrucción a ejecutar), continuando la ejecución del
código

(1) El tiempo que tarda esta secuencia en ejecutarse es de 5 ciclos de reloj


(2) Este comportamiento implica que se vuelve al estado original de la CPU: activa o bajo consumo (bits SCG1, SCG0,
OSCOFF, CPUOFF), habilitación de las interrupciones enmascarables (bit GIE), flags de estado (bits V, N, Z, C)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.24
3. Interrupciones – 3.3. Vectores de interrupción

3.3. Vectores de interrupción


─ Durante el procesamiento de cualquier interrupción es necesario conocer la
dirección del código correspondiente a la RTI que debe ejecutarse para realizar
su tratamiento
─ Esta información está almacenada en una tabla conocida como tabla de
vectores de interrupción ubicada al final del mapa de memoria (en la memoria
flash), donde cada posible interrupción posee una entrada en la tabla con la
dirección de comienzo de la RTI asociada a la misma
─ Es responsabilidad del programador inicializar correctamente los valores
almacenados en la tabla de vectores de interrupción, de forma que al generarse
cualquier interrupción se pueda localizar la RTI correspondiente

0xFFFF Vectores
Flash 64 B
0xFFC0 Interrupción

0xFFBF

Flash Código 16 KB

0xC000

NO UTILIZADA

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.25
3. Interrupciones – 3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.26
3. Interrupciones – 3.3. Vectores de interrupción

Fuentes de
interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.27
3. Interrupciones – 3.3. Vectores de interrupción

Flags de
interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.28
3. Interrupciones – 3.3. Vectores de interrupción

Tipo de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.29
3. Interrupciones – 3.3. Vectores de interrupción

Posición en la tabla
de vectores de
interrupción
(dirección de
memoria) donde se
debe almacenar la
dirección de
comienzo de la RTI
asociada a cada
interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.30
3. Interrupciones – 3.3. Vectores de interrupción

Prioridad de cada
interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.31
3. Interrupciones – 3.3. Vectores de interrupción

Interrupción con
múltiples fuentes

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.32
3. Interrupciones – 3.3. Vectores de interrupción

Periférico E/S con


múltiples
interrupciones

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.33
3. Interrupciones – 3.4. Esquema completo

3.4. Esquema completo


─ Características:
• Programa principal: dirección 0xC000
• Base de la pila: dirección 0x0400
• Interrupción: Timer1_A3  TACCR0 CCIFG  vector 0xFFFA

0xFFFE 0xC000

PC 0xC01E MOV.B @R4+,R7 PC 0xC01E 0xFFFC 0xFFFF Vectores


0xC020 ADD.W #0x10,R7 SP 0x03FE 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x010E

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
SP 0x03FE 0xC042
… 0x03FC 0x0000
Pila
0x03FA 0x0000

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.34
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC020 0xFFFC 0xFFFF Vectores


PC 0xC020 ADD.W #0x10,R7 SP 0x03FE 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x010E

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
SP 0x03FE 0xC042
… 0x03FC 0x0000
Pila
0x03FA 0x0000

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.35
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC020 0xFFFC 0xFFFF Vectores


PC 0xC020 ADD.W #0x10,R7 SP 0x03FC 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x010E

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
0x03FE 0xC042
… 0xC020
SP 0x03FC
Pila
0x03FA 0x0000

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.36
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC020 0xFFFC 0xFFFF Vectores


PC 0xC020 ADD.W #0x10,R7 SP 0x03FA 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x010E

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
0x03FE 0xC042
… 0x03FC 0xC020
Pila
SP 0x03FA 0x010E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.37
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC020 0xFFFC 0xFFFF Vectores


PC 0xC020 ADD.W #0x10,R7 SP 0x03FA 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x0000

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
0x03FE 0xC042
… 0x03FC 0xC020
Pila
SP 0x03FA 0x010E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.38
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC06A 0xFFFC 0xFFFF Vectores


0xC020 ADD.W #0x10,R7 SP 0x03FA 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x0000

PC 0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
0x03FE 0xC042
… 0x03FC 0xC020
Pila
SP 0x03FA 0x010E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.39
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC070 0xFFFC 0xFFFF Vectores


0xC020 ADD.W #0x10,R7 SP 0x03FA 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x0000

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
0x03FE 0xC042
PC … 0x03FC 0xC020
Pila
SP 0x03FA 0x010E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.40
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC070 0xFFFC 0xFFFF Vectores


0xC020 ADD.W #0x10,R7 SP 0x03FC 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x010E

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
0x03FE 0xC042
PC …
SP 0x03FC 0xC020
Pila
0x03FA 0x010E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.41
3. Interrupciones – 3.4. Esquema completo

1. Finaliza la ejecución de la instrucción actual si la CPU se encuentra activa, o se activa la CPU si se encuentra en bajo consumo
2. El contador de programa PC (que apunta a la siguiente instrucción a ejecutar) se almacena en la pila
3. El registro de estado SR se almacena en la pila
4. Si existen múltiples interrupciones pendientes se escoge la de mayor prioridad
5. Si la interrupción tiene una única fuente se inicializa a ‘0’ el flag de interrupción asociado a la misma, y si tiene múltiples fuentes no se
modifica ninguno de los flags de interrupción asociados a las mismas
6. Se inicializa a ‘0’ el registro de estado SR, activando la CPU si estaba en bajo consumo y deshabilitando las interrupciones enmascarables
7. El contenido del vector de interrupción asociado a la misma se carga en el contador de programa PC, comenzando la ejecución de la RTI
8. Finaliza la ejecución de la RTI
9. Se restaura el registro de estado SR con el almacenado en la pila
10. Se restaura el contador de programa PC con el almacenado en la pila (que apunta a la siguiente instrucción a ejecutar), continuando la
ejecución del código

0xFFFE 0xC000

0xC01E MOV.B @R4+,R7 PC 0xC020 0xFFFC 0xFFFF Vectores


PC 0xC020 ADD.W #0x10,R7 SP 0x03FE 0xFFFA 0xC06A Interupción
0xC024 XOR.W #0xA5,R7 …
SR 0x010E

0xC06A CLR.W R4

0xC06C CLR.W R7 RTI


0xC06E RETI
SP 0x03FE 0xC042
… 0x03FC 0xC020
Pila
0x03FA 0x010E

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.42
Índice

1. Introducción 3.4. Esquema completo


2. Reset 4. Módulo de reloj
2.1. Tipos de reset 4.1. Estructura
2.1.1. POR (Power-On Reset) 4.2. Fuentes de reloj
2.1.2. PUC (Power-Up Clear) 4.2.1. VLOCLK
2.2. Estado del 4.2.2. LFXT1CLK
microcontrolador 4.2.3. DCOCLK
4.3. Señales de reloj
3. Interrupciones
4.3.1. ACLK
3.1. Tipos de interrupciones 4.3.2. MCLK
3.1.1. Reset 4.3.3. SMCLK
3.1.2. (No) enmascarables
4.4. Registros de
3.1.3. Enmascarables
configuración
3.2. Procesamiento
3.2.1. Tratamiento de la 5. Bajo consumo
interrupción 5.1. Modos de operación
3.2.2. Retorno de la
interrupción
5.2. Cambio del modo de
operación
3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.43
4. Módulo de reloj

4. Módulo de reloj
─ Proporciona las distintas señales de reloj necesarias para permitir la operación
del microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.44
4. Módulo de reloj

─ Características:
• Fuentes de reloj: admite distintas fuentes de reloj tanto internas como
externas para generar las señales de reloj del sistema
• Señales de reloj: a partir de las fuentes de reloj genera distintas señales de
reloj para controlar la CPU y los periféricos E/S independientemente
• Compromiso: existe un claro compromiso entre rendimiento y consumo en
función de la frecuencia de las señales de reloj utilizadas en el sistema:
- Rendimiento: cuanto mayor sea la frecuencia de las señales de reloj
mayor es la capacidad de proceso del sistema y menor es el tiempo de
respuesta para la detección y atención de eventos
- Consumo: cuanto menor sea la frecuencia de las señales de reloj
menor es el consumo del sistema al realizar un menor número de
operaciones por segundo
• Optimización: disponer de distintas señales de reloj permite al programador
seleccionar las más adecuadas para obtener un balance óptimo entre
rendimiento y consumo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.45
4. Módulo de reloj – 4.1. Estructura

4.1. Estructura
MSP430x2xx MSP430G2533

No soportado por el
MSP430G2533

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.46
4. Módulo de reloj – 4.2. Fuentes de reloj

4.2. Fuentes de reloj


─ Señales básicas utilizadas para generar las señales de reloj disponibles en el
microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.47
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.1. VLOCLK

4.2.1. VLOCLK

─ Oscilador interno de muy baja frecuencia (~ 12 KHz) y muy bajo consumo:


 No requiere elementos externos
 Baja precisión

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.48
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.1. VLOCLK

─ Selección: se selecciona con los bits LFXT1Sx del registro BCSCTL3(1)

─ Desactivación: se desactiva con el bit OSCOFF del registro de estado SR

(1) Las fuentes de reloj VLOCLK y LFXT1CLK son complementarias, por lo que sólo se puede utilizar una de ellas. Cuando
se selecciona una de ellas, la otra se desactiva automáticamente para reducir el consumo
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.49
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.2. LFXT1CLK

4.2.2. LFXT1CLK

─ Oscilador de baja frecuencia (32768 Hz) y bajo consumo:


 Alta precisión
 Requiere elementos externos (cristal de cuarzo de 32768 Hz o señal de
reloj externa)
 Necesita cientos de milisegundos para estabilizarse

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.50
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.2. LFXT1CLK

─ Selección: se selecciona con los bits LFXT1Sx del registro BCSCTL3(1)

─ Desactivación: se desactiva con el bit OSCOFF del registro de estado SR,


siempre que no se utilice para generar las señales de reloj MCLK o SMCLK

(1) Las fuentes de reloj VLOCLK y LFXT1CLK son complementarias, por lo que sólo se puede utilizar una de ellas. Cuando
se selecciona una de ellas, la otra se desactiva automáticamente para reducir el consumo
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.51
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.2. LFXT1CLK

─ Detección de fallos: el módulo de reloj dispone de un circuito específico para


detectar fallos en la fuente de reloj LFXT1CLK si no se genera adecuadamente la
señal correspondiente:
• El bit LFXT1OF del registro BCSCTL3 permanece activo mientras no se
genere correctamente la señal de la fuente de reloj LFXT1CLK (por ejemplo
mientras se estabiliza la señal generada)

• Se activa el flag de interrupción OFIFG del registro IFG1

• Si la fuente de reloj LFXT1CLK se usa para generar la señal de reloj MCLK


el módulo de reloj conmuta automáticamente a la fuente de reloj DCOCLK
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.52
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.2. LFXT1CLK

─ Estabilización: para esperar a la estabilización de la fuente de reloj LFXT1CLK


antes de ser usada es recomendable utilizar una rutina de espera como la que se
muestra a continuación:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.53
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

4.2.3. DCOCLK

─ Oscilador interno tipo RC controlado digitalmente:


 No requiere elementos externos
 Baja precisión

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.54
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

─ Frecuencia: su frecuencia se controla con los bits DCOx y MODx del registro
DCOCTL y con los bits RSELx del registro BCSCTL1(1)

(1) Tras un reset (PUC): DCOx = 0x03 ; MODx = 0x00 ; RSELx = 0x07  fDCO ~ 1.1 MHz
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.55
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

MSP430G2533

PUC

Δ = 35%
Δ = 8%

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.56
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

MSP430G2533

Frecuencia ↓  Alimentación ↓  Consumo ↓

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.57
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

─ Calibración: para aumentar su precisión, cada dispositivo ha sido calibrado con


los valores exactos a introducir en los bits DCOx, MODx y RSELx para obtener
una frecuencia determinada. Estos valores se encuentran en la información de
calibración almacenada en la flash del dispositivo:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.58
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.59
4. Módulo de reloj – 4.2. Fuentes de reloj – 4.2.3. DCOCLK

─ Desactivación: se desactiva con el bit SCG0 del registro de estado SR, siempre
que no se utilice para generar las señales de reloj MCLK o SMCLK

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.60
4. Módulo de reloj – 4.3. Señales de reloj

4.3. Señales de reloj


─ Señales de reloj utilizadas para controlar la CPU y los periféricos E/S del
microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.61
4. Módulo de reloj – 4.3. Señales de reloj – 4.3.1. ACLK

4.3.1. ACLK

─ Se genera a partir de las fuentes de reloj VLOCLK o LFXT1CLK


─ Permite dividir la fuente de reloj por 1/2/4/8 mediante los bits DIVAx del registro
BCSCTL1
─ Se utiliza para controlar periféricos E/S que operen a bajas frecuencias

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.62
4. Módulo de reloj – 4.3. Señales de reloj – 4.3.2. MCLK

4.3.2. MCLK

─ Se genera a partir de las fuentes de reloj VLOCLK, LFXT1CLK o DCOCLK


─ Permite dividir la fuente de reloj por 1/2/4/8 mediante los bits DIVMx del registro
BCSCTL2
─ Se utiliza para controlar la CPU

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.63
4. Módulo de reloj – 4.3. Señales de reloj – 4.3.3. SMCLK

4.3.3. SMCLK

─ Se genera a partir de las fuentes de reloj VLOCLK, LFXT1CLK o DCOCLK


─ Permite dividir la fuente de reloj por 1/2/4/8 mediante los bits DIVSx del registro
BCSCTL2
─ Se utiliza para controlar periféricos E/S que operen a bajas/altas frecuencias

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.64
4. Módulo de reloj – 4.4. Registros de configuración

4.4. Registros de configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.65
4. Módulo de reloj – 4.4. Registros de configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.66
4. Módulo de reloj – 4.4. Registros de configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.67
4. Módulo de reloj – 4.4. Registros de configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.68
Índice

1. Introducción 3.4. Esquema completo


2. Reset 4. Módulo de reloj
2.1. Tipos de reset 4.1. Estructura
2.1.1. POR (Power-On Reset) 4.2. Fuentes de reloj
2.1.2. PUC (Power-Up Clear) 4.2.1. VLOCLK
2.2. Estado del 4.2.2. LFXT1CLK
microcontrolador 4.2.3. DCOCLK
4.3. Señales de reloj
3. Interrupciones
4.3.1. ACLK
3.1. Tipos de interrupciones 4.3.2. MCLK
3.1.1. Reset 4.3.3. SMCLK
3.1.2. (No) enmascarables
4.4. Registros de
3.1.3. Enmascarables
configuración
3.2. Procesamiento
3.2.1. Tratamiento de la 5. Bajo consumo
interrupción 5.1. Modos de operación
3.2.2. Retorno de la
interrupción
5.2. Cambio del modo de
operación
3.3. Vectores de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.69
5. Bajo consumo

5. Bajo consumo
─ En el diseño de sistemas basados en microcontroladores existe un claro
compromiso entre rendimiento y consumo:
• Rendimiento: relacionado con la capacidad de proceso del sistema y con el
tiempo de respuesta para la detección y gestión de eventos  interesan
altas frecuencias de operación
• Consumo: relacionado con la duración de la(s) batería(s) en sistemas
portables  interesan bajas frecuencias de operación
─ Disponer de distintas señales de reloj (ACLK, MCLK y SMCLK) permite:
• Seleccionar para cada recurso del microcontrolador (CPU y periféricos E/S)
la señal de reloj más idónea para obtener un balance óptimo entre
rendimiento y consumo en función de la frecuencia de operación
• Deshabilitar selectivamente las señales de reloj que controlan aquellos
recursos del microcontrolador (CPU y periféricos E/S) que no se utilizan(1)
para reducir el consumo

(1) Deshabilitar señales de reloj implica desactivar aquellos recursos que las utilizan
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.70
5. Bajo consumo – 5.1. Modos de operación

5.1. Modos de operación


─ Los modos de operación hacen referencia a las distintas combinaciones de
señales de reloj habilitadas y deshabilitadas que se utilizan en el
microcontrolador para reducir el consumo
─ La familia MSP430 proporciona 6 modos de operación:
• Modo activo AM (“Active Mode”)

Menor consumo
• Modo de bajo consumo LPM0 (“Low Power Mode 0”)
• Modo de bajo consumo LPM1 (“Low Power Mode 1”)
• Modo de bajo consumo LPM2 (“Low Power Mode 2”)
• Modo de bajo consumo LPM3 (“Low Power Mode 3”)
• Modo de bajo consumo LPM4 (“Low Power Mode 4”)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.71
5. Bajo consumo – 5.1. Modos de operación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.72
5. Bajo consumo – 5.1. Modos de operación

─ El modo activo mantiene todas las señales de reloj habilitadas, por lo que
permanecen activos todos los recursos necesarios del microcontrolador:
 Menor tiempo de respuesta al permanecer activos todos los recursos
necesarios
 Mayor consumo
─ Los modos de bajo consumo deshabilitan selectivamente ciertas señales de
reloj, por lo que permanecen desactivados los recursos del microcontrolador que
dependen de las mismas:
 Menor consumo
 Mayor tiempo de respuesta al tener que activar los recursos necesarios(1)

(1) Activar recursos del microcontrolador implica habilitar las señales de reloj que los controlan, proceso que requiere cierto
tiempo en función de las señales de reloj que haya que habilitar
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.73
5. Bajo consumo – 5.1. Modos de operación

─ Existen dos estrategias distintas para implementar los modos de bajo


consumo:
• Fuentes de reloj: deshabilitar las fuentes de reloj (VLOCLK, LFXT1CLK,
DCOCLK) implica deshabilitar las señales de reloj que dependen de ellas, y
por lo tanto desactivar los recursos que utilizan estas señales de reloj
 Menor consumo al permanecer deshabilitadas las fuentes de reloj
 Mayor tiempo de respuesta para activar los recursos necesarios, pues
es necesario habilitar las fuentes de reloj para generar posteriormente
las señales de reloj adecuadas
• Señales de reloj: deshabilitar las señales de reloj (ACLK, MCLK, SMCLK)
implica desactivar los recursos que utilizan estas señales de reloj
 Menor tiempo de respuesta para activar los recursos necesarios, pues
sólo hay que generar las señales de reloj adecuadas a partir de las
fuentes de reloj ya habilitadas
 Mayor consumo al permanecer habilitadas las fuentes de reloj

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.74
5. Bajo consumo – 5.1. Modos de operación

─ Los modos de operación se controlan con los bits SCG1, SCG0, OSCOFF y
CPUOFF del registro de estado SR:

Señal
Fuente
Fuente
Señal

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.75
5. Bajo consumo – 5.1. Modos de operación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.76
5. Bajo consumo – 5.1. Modos de operación

─ Modo activo AM

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.77
5. Bajo consumo – 5.1. Modos de operación

─ Modo de bajo consumo LPM0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.78
5. Bajo consumo – 5.1. Modos de operación

─ Modo de bajo consumo LPM1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.79
5. Bajo consumo – 5.1. Modos de operación

─ Modo de bajo consumo LPM2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.80
5. Bajo consumo – 5.1. Modos de operación

─ Modo de bajo consumo LPM3

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.81
5. Bajo consumo – 5.1. Modos de operación

─ Modo de bajo consumo LPM4

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.82
5. Bajo consumo – 5.2. Cambio del modo de operación

5.2. Cambio del modo de operación


─ Para entrar en un modo de bajo consumo desde el programa principal hay
que modificar los bits correspondientes del registro de estado SR:
• LPM0: BIS.W #CPUOFF,SR
BIS.W #LPM0,SR
• LPM1: BIS.W #SCG0+CPUOFF,SR
BIS.W #LPM1,SR
• LPM2: BIS.W #SCG1+CPUOFF,SR
Ensamblador
BIS.W #LPM2,SR
• LPM3: BIS.W #SCG1+SCG0+CPUOFF,SR
BIS.W #LPM3,SR
• LPM4: BIS.W #SCG1+SCG0+OSCOFF+CPUOFF,SR
BIS.W #LPM4,SR

• LPMn: _low_power_mode_n()  GIE = 1 C

¡CUIDADO!

NOTA: Las constantes SCG0, SCG1, OSCOFF, CPUOFF, LPM0, LPM1, LPM2, LPM3 y LPM4 se encuentran definidas en
el fichero de cabecera “msp430g2533.h”
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.83
5. Bajo consumo – 5.2. Cambio del modo de operación

─ Para salir de un modo de bajo consumo desde una RTI hay que modificar los
bits correspondientes del registro de estado SR que será restaurado tras finalizar
la RTI, el cual se encuentra almacenado en la parte superior de la pila:
• LPM0: BIC.W #CPUOFF,0(SP)
BIC.W #LPM0,0(SP)
• LPM1: BIC.W #SCG0+CPUOFF,0(SP)
BIC.W #LPM1,0(SP)
• LPM2: BIC.W #SCG1+CPUOFF,0(SP)
Ensamblador
BIC.W #LPM2,0(SP)
• LPM3: BIC.W #SCG1+SCG0+CPUOFF,0(SP)
BIC.W #LPM3,0(SP)
• LPM4: BIC.W #SCG1+SCG0+OSCOFF+CPUOFF,0(SP)
BIC.W #LPM4,0(SP)

• LPMn: _low_power_mode_off_on_exit() C

NOTA: Las constantes SCG0, SCG1, OSCOFF, CPUOFF, LPM0, LPM1, LPM2, LPM3 y LPM4 se encuentran definidas en
el fichero de cabecera “msp430g2533.h”
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T4.84
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Ejercicios Tema 4:
Hardware básico

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.0
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.1
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.2
1. Enunciados – Ejercicio 1

Ejercicio 1:
─ Se representan a continuación los registros especiales del microcontrolador
MSP430G2533:

a) Indicar el valor al que se inicializan dichos registros al encender el


dispositivo
b) Tras la ejecución del código, el valor de los registros es:
• IE1  0x12 – IE2  0x01 – IFG1  0x05 – IFG2  0x0E
Indicar el valor al que se inicializan dichos registros al expirar el tiempo del
watchdog

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.3
1. Enunciados – Ejercicio 2

Ejercicio 2:
─ Se dispone del siguiente código para el MSP430G2533:
• Programa principal: 0xC000
0xC00A MOV.B #0x02,R10
• RTI 1: Timer1_A3  TACCR0 CCIFG
0xC00C RLA.B R10

• RTI 2: Watchdog Timer+  WDTIFG 0xC00E JMP 0xC00E


• RTI 3: ADC10  ADC10IFG 0xC10A RRA.B R10

0xC10C INCD.B R10 RTI 1


0xC10E RETI

0xC20A RLA.B R10

0xC20C DECD.B R10 RTI 2


0xC20E RETI

0xC30A DEC.B R10

0xC30C MOV.W #0xC00C,2(SP) RTI 3


0xC312 RETI

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.4
1. Enunciados – Ejercicio 2

a) Inicializar los valores almacenados en la tabla de vectores de interrupción


b) Indicar el valor final del registro R10, suponiendo que se produce la
siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al Watchdog Timer+
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se generan las interrupciones correspondientes al Timer1_A3 y
al ADC10 simultáneamente

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.5
1. Enunciados – Ejercicio 3

Ejercicio 3:
─ Se dispone del siguiente código para el MSP430G2533:
• Programa principal: 0xC000
• RTI 1: I/O Port P1  P1IFG.0
• RTI 2: I/O Port P2  P2IFG.0

0xC00A CLR.B R10

0xC00C MOV.B #0x01,R10

0xC00E JMP 0xC00E

0xC10A MOV.B #0x02,R10

0xC10C BIC.B #BIT0,&P1IFG RTI 1


0xC110 RETI

0xC20A MOV.B #0x04,R10


RTI 2
0xC20C RETI

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.6
1. Enunciados – Ejercicio 3

a) Indicar el valor final del registro R10, suponiendo que se produce la


siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al I/O Port P2
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se genera la interrupción correspondiente al I/O Port P1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.7
1. Enunciados – Ejercicio 4

Ejercicio 4:
─ Indicar la frecuencia de las fuentes de reloj y de las señales de reloj por defecto
del microcontrolador MSP430G2533 de la placa LaunchPad al encender el
dispositivo, suponiendo que no se ha integrado el cristal de cuarzo de 32768 Hz

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.8
1. Enunciados – Ejercicio 5

Ejercicio 5:
─ Se pretende utilizar el microcontrolador MSP430G2533 para implementar un
reloj digital, empleando para ello la frecuencia calibrada del DCO de valor 1 MHz:
a) Indicar los valores a introducir en los registros de configuración del módulo
de reloj para obtener dicha frecuencia
b) Indicar el error máximo que podría acumular a lo largo de un día el reloj
digital, debido a la tolerancia de la frecuencia calibrada del DCO

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.9
1. Enunciados – Ejercicio 6

Ejercicio 6:
─ Se dispone del siguiente código para el MSP430G2533:
a) Indicar la instrucción ubicada en la posición 0xC00E para entrar en el
modo de bajo consumo LPM3
b) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo activo AM al finalizar la
interrupción
c) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo de bajo consumo LPM2 al
finalizar la interrupción

0xC00A CLR.B R10

0xC00C MOV.B #0x01,R10

0xC00E ?

0xC10A MOV.B #0x02,R10

0xC10C ? RTI
0xC112 RETI

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.10
1. Enunciados – Ejercicio 7

Ejercicio 7:
─ Los modos de operación del MSP430G2533 se controlan con los bits SCG1,
SCG0, OSCOFF y CPUOFF del registro de estado SR. Aunque existen 6 modos
de operación, estos 4 bits permiten implementar 16 combinaciones distintas:
a) Realizar una tabla indicando para cada una de estas 16 combinaciones las
fuentes de reloj y las señales de reloj habilitadas/deshabilitadas,
considerando que la señal de reloj ACLK se genera a partir de la fuente de
reloj VLOCLK/LFXT1CLK, y las señales de reloj MCLK y SMCLK se
generan a partir de la fuente de reloj DCOCLK

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.11
1. Enunciados – Ejercicio 8

Ejercicio 8:
─ La placa LaunchPad dispone del pulsador S1 conectado al terminal RST/NMI
(pulsador reset del microcontrolador) y del pulsador S2 conectado al pin P1.3
(pulsador genérico):
a) Indicar las modificaciones a realizar para configurar el pulsador S1 como
un pulsador genérico

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.12
1. Enunciados – Ejercicio 9

Ejercicio 9:
─ Se dispone del siguiente código para el MSP430G2533:
• Programa principal: 0xC000
• RTI 1: I/O Port P1  P1IFG.0
• RTI 2: I/O Port P2  P2IFG.0
0xC00A CLR.B R10

0xC00C MOV.B #0x01,R10

0xC00E JMP 0xC00E

0xC10A MOV.B R11,R10

0xC10C BIC.B #BIT0,&P1IFG RTI 1


0xC110 RETI

0xC20A MOV.B #0x02,R11


RTI 2
0xC20C RET

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.13
1. Enunciados – Ejercicio 9

a) Indicar el valor final del registro R10, suponiendo que se produce la


siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al I/O Port P2
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se genera la interrupción correspondiente al I/O Port P1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.14
1. Enunciados – Ejercicio 10

Ejercicio 10:
─ Indicar 2 combinaciones distintas de valores para los bits DCOx y MODx del
registro DCOCTL y para los bits RSELx del registro BCSCTL1 de forma que el
DCO del MSP430G2533 se configure a una frecuencia aproximada de 2 MHz

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.15
1. Enunciados – Ejercicio 11

Ejercicio 11:
─ Se pretende utilizar un microcontrolador de la familia MSP430 para implementar
un reloj digital, empleando para ello la frecuencia calibrada del DCO de 1 MHz y
una pila de botón CR 2032 con tensión de 3 V y capacidad de 220 mAh:
a) Indicar de forma aproximada la duración de la pila si el microcontrolador se
encuentra siempre en el modo activo AM
b) Indicar de forma aproximada la duración de la pila si el microcontrolador se
encuentra el 99% del tiempo en el modo de bajo consumo LPM3 y el 1%
del tiempo en el modo activo AM

NOTA: El icono indica que este ejercicio es avanzado, por lo que requiere un estudio más profundo de la documentación
para adquirir conocimientos no descritos en clase
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.16
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.17
2. Solución – Ejercicio 1

Ejercicio 1:
a) Indicar el valor al que se inicializan dichos registros al encender el
dispositivo
b) Tras la ejecución del código, el valor de los registros es:
• IE1  0x12 – IE2  0x01 – IFG1  0x05 – IFG2  0x0E
Indicar el valor al que se inicializan dichos registros al expirar el tiempo del
watchdog

IE1 0x00
IE2 0x00
IFG1 0x06
IFG2 0x0A

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.18
2. Solución – Ejercicio 1

a) Indicar el valor al que se inicializan dichos registros al encender el


dispositivo
b) Tras la ejecución del código, el valor de los registros es:
• IE1  0x12 – IE2  0x01 – IFG1  0x05 – IFG2  0x0E
Indicar el valor al que se inicializan dichos registros al expirar el tiempo del
watchdog

IE1 0x00
IE2 0x00
IFG1 0x07
IFG2 0x0A

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.19
2. Solución – Ejercicio 2

Ejercicio 2:
a) Inicializar los valores almacenados en la tabla de vectores de interrupción
b) Indicar el valor final del registro R10, suponiendo que se produce la
siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al Watchdog Timer+
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se generan las interrupciones correspondientes al Timer1_A3 y
al ADC10 simultáneamente

0xFFFE 0xC000

0xFFFA 0xC10A


Vectores
0xFFF4 0xC20A
Interrupción

0xFFEA 0xC30A

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.20
2. Solución – Ejercicio 2

a) Inicializar los valores almacenados en la tabla de vectores de interrupción


b) Indicar el valor final del registro R10, suponiendo que se produce la
siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al Watchdog Timer+
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se generan las interrupciones correspondientes al Timer1_A3 y
al ADC10 simultáneamente

R10 0x08

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.21
2. Solución – Ejercicio 3

Ejercicio 3:
a) Indicar el valor final del registro R10, suponiendo que se produce la
siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al I/O Port P2
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se genera la interrupción correspondiente al I/O Port P1

R10 0x04

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.22
2. Solución – Ejercicio 4

Ejercicio 4:
DCOCTL 0x60
VLOCLK ~ 12 KHz ACLK Sin señal
BCSCTL1 0x87
LFXT1CLK Sin señal MCLK ~ 1.1 MHz
BCSCTL2 0x00
DCOCLK ~ 1.1 MHz SMCLK ~ 1.1 MHz
BCSCTL3 0x05

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.23
2. Solución – Ejercicio 5

Ejercicio 5:
a) Indicar los valores a introducir en los registros de configuración del módulo
de reloj para obtener dicha frecuencia
b) Indicar el error máximo que podría acumular a lo largo de un día el reloj
digital, debido a la tolerancia de la frecuencia calibrada del DCO

DCOCTL CALDCO_1MHz
BCSCTL1 CALBC1_1MHz

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.24
2. Solución – Ejercicio 5

a) Indicar los valores a introducir en los registros de configuración del módulo


de reloj para obtener dicha frecuencia
b) Indicar el error máximo que podría acumular a lo largo de un día el reloj
digital, debido a la tolerancia de la frecuencia calibrada del DCO

Error Máximo ~ 5184 segundos ~ 86.4 minutos ~ 1.44 horas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.25
2. Solución – Ejercicio 6

Ejercicio 6:
a) Indicar la instrucción ubicada en la posición 0xC00E para entrar en el
modo de bajo consumo LPM3
b) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo activo AM al finalizar la
interrupción
c) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo de bajo consumo LPM2 al
finalizar la interrupción

0xC00E BIS.W #LPM3,SR

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.26
2. Solución – Ejercicio 6

a) Indicar la instrucción ubicada en la posición 0xC00E para entrar en el


modo de bajo consumo LPM3
b) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo activo AM al finalizar la
interrupción
c) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo de bajo consumo LPM2 al
finalizar la interrupción

0xC10C BIC.W #LPM3,0(SP)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.27
2. Solución – Ejercicio 6

a) Indicar la instrucción ubicada en la posición 0xC00E para entrar en el


modo de bajo consumo LPM3
b) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo activo AM al finalizar la
interrupción
c) Indicar la instrucción ubicada en la posición 0xC10C para salir del modo de
bajo consumo LPM3 y entrar en el modo de bajo consumo LPM2 al
finalizar la interrupción

0xC10C BIC.W #SCG0,0(SP)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.28
2. Solución – Ejercicio 7

Ejercicio 7:
a) Realizar una tabla indicando para cada una de estas 16 combinaciones las
fuentes de reloj y las señales de reloj habilitadas/deshabilitadas,
considerando que la señal de reloj ACLK se genera a partir de la fuente de
reloj VLOCLK/LFXT1CLK, y las señales de reloj MCLK y SMCLK se
generan a partir de la fuente de reloj DCOCLK

VLOCLK
SCG1 SCG0 OSCOFF CPUOFF DCOCLK ACLK MCLK SMCLK
LFXT1CLK
0 0 0 0      AM
0 0 0 1      LPM0
0 0 1 0     
0 0 1 1     
0 1 0 0     
0 1 0 1      LPM1
0 1 1 0     
0 1 1 1     
1 0 0 0     
1 0 0 1      LPM2
1 0 1 0     
1 0 1 1     
1 1 0 0     
1 1 0 1      LPM3
1 1 1 0     
1 1 1 1      LPM4

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.29
2. Solución – Ejercicio 8

Ejercicio 8:
a) Indicar las modificaciones a realizar para configurar el pulsador S1 como
un pulsador genérico

MOV.W #WDTPW+WDTHOLD+WDTNMI+WDTNMIES,&WDTCTL
0xFFFC Comienzo RTI interrupción NMI (pulsador S1)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.30
2. Solución – Ejercicio 9

Ejercicio 9:
a) Indicar el valor final del registro R10, suponiendo que se produce la
siguiente secuencia:
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC00C se genera la interrupción correspondiente al I/O Port P2
- Mientras se está ejecutando la instrucción ubicada en la posición
0xC20A se genera la interrupción correspondiente al I/O Port P1

R10 0x01

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.31
2. Solución – Ejercicio 10

Ejercicio 10:
DCOx 5
MODx 29
RSELx 8

DCOx 1
MODx 6
RSELx 9

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.32
2. Solución – Ejercicio 11

Ejercicio 11:
a) Indicar de forma aproximada la duración de la pila si el microcontrolador se
encuentra siempre en el modo activo AM
b) Indicar de forma aproximada la duración de la pila si el microcontrolador se
encuentra el 99% del tiempo en el modo de bajo consumo LPM3 y el 1%
del tiempo en el modo activo AM

Duración ~ 733.33 horas ~ 30.56 días ~ 0.08 años

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.33
2. Solución – Ejercicio 11

a) Indicar de forma aproximada la duración de la pila si el microcontrolador se


encuentra siempre en el modo activo AM
b) Indicar de forma aproximada la duración de la pila si el microcontrolador se
encuentra el 99% del tiempo en el modo de bajo consumo LPM3 y el 1%
del tiempo en el modo activo AM

Duración ~ 56540.74 horas ~ 2355.86 días ~ 6.45 años

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET4.34
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 5:
Puertos E/S

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.0
Índice

1. Introducción
2. Operación
2.1. Entrada y salida digital
2.2. Resistencias de pullup y
pulldown
2.3. Oscilación
2.4. Interrupciones
2.4.1. Habilitación de
interrupciones
2.4.2. Flags de interrupción
2.5. Funcionalidad
3. Configuración
4. Ejemplos
4.1. Pulsador
4.2. LED

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.1
Índice

1. Introducción
2. Operación
2.1. Entrada y salida digital
2.2. Resistencias de pullup y
pulldown
2.3. Oscilación
2.4. Interrupciones
2.4.1. Habilitación de
interrupciones
2.4.2. Flags de interrupción
2.5. Funcionalidad
3. Configuración
4. Ejemplos
4.1. Pulsador
4.2. LED

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.2
1. Introducción

1. Introducción
MSP430G2533 (encapsulado de 20 pines):

Puertos E/S

NOTA: El puerto E/S P3 sólo está disponible para los encapsulados de 28 y 32 pines
NOTA: En la placa LaunchPad se utiliza el encapsulado de 20 pines
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.3
1. Introducción

─ Funcionalidad: los puertos E/S permiten introducir (Entrada) o extraer


(Salida) valores digitales en el microcontrolador a través de sus pines:
• Entrada: útil para comprobar el valor de señales digitales generadas por
dispositivos externos (pulsadores, teclados…)

1-0 1 0

• Salida: útil para generar señales digitales que controlen dispositivos


externos (LEDs, relés…)

0-1 0 1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.4
Índice

1. Introducción
2. Operación
2.1. Entrada y salida digital
2.2. Resistencias de pullup y
pulldown
2.3. Oscilación
2.4. Interrupciones
2.4.1. Habilitación de
interrupciones
2.4.2. Flags de interrupción
2.5. Funcionalidad
3. Configuración
4. Ejemplos
4.1. Pulsador
4.2. LED

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.5
2. Operación

2. Operación
─ Características:
• Existen 2 puertos E/S (P1 y P2) con 8 pines cada uno
• Cada pin de los puertos E/S se puede configurar como entrada o salida
independientemente de la configuración de los demás pines
• Cada pin de los puertos E/S dispone de resistencias de pullup y pulldown
que se pueden habilitar/deshabilitar independientemente de la configuración
de los demás pines
• Cada pin de los puertos E/S posee la capacidad de producir oscilaciones(1)
sin necesidad de elementos externos independientemente de la
configuración de los demás pines
• Cada pin de los puertos E/S P1 y P2 puede generar interrupciones al
detectar cambios de nivel en la señal digital externa
• Cada pin de los puertos E/S es utilizado por otros periféricos, por lo que
además de la funcionalidad de entrada y salida digital poseen otras
funcionalidades, siendo necesario seleccionar la funcionalidad concreta
que se le quiere asignar a cada pin

(1) Útil para conexión de sensores capacitivos (como por ejemplo sensores táctiles)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.6
2. Operación

─ Diagrama de bloques (P2.0 – P2.5):

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.7
2. Operación – 2.1. Entrada y salida digital

2.1. Entrada y salida digital


─ La dirección (entrada o salida digital) de cada pin de los puertos E/S P1 y P2
se establece mediante los bits de los registros P1DIR y P2DIR respectivamente:
• Bit Px = 0  Pin Px configurado como entrada digital
• Bit Px = 1  Pin Px configurado como salida digital

Dirección del pin 3


del puerto E/S P1

P1DIR P7 P6 P5 P4 P3 P2 P1 P0

P2DIR P7 P6 P5 P4 P3 P2 P1 P0

Dirección del pin 1


del puerto E/S P2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.8
2. Operación – 2.1. Entrada y salida digital

─ El valor que poseen las señales digitales conectadas a los pines de los
puertos E/S P1 y P2 configurados como entrada se puede comprobar mediante
los bits de los registros P1IN y P2IN respectivamente:
• Bit Px = 0  Valor ‘0’ en la señal digital conectada al pin Px
• Bit Px = 1  Valor ‘1’ en la señal digital conectada al pin Px

Valor de la señal digital conectada


al pin 3 del puerto E/S P1

P1IN P7 P6 P5 P4 P3 P2 P1 P0

P2IN P7 P6 P5 P4 P3 P2 P1 P0

Valor de la señal digital conectada


al pin 1 del puerto E/S P2

NOTA: Los registros P1IN y P2IN son de sólo lectura, por lo que cualquier escritura en los mismos es ignorada y sólo
produce un aumento en el consumo de corriente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.9
2. Operación – 2.1. Entrada y salida digital

─ El valor de las señales digitales generadas en los pines de los puertos E/S P1
y P2 configurados como salida se establece mediante los bits de los registros
P1OUT y P2OUT respectivamente:
• Bit Px = 0  Valor ‘0’ en la señal digital generada en el pin Px
• Bit Px = 1  Valor ‘1’ en la señal digital generada en el pin Px

Valor de la señal digital generada


en el pin 3 del puerto E/S P1

P1OUT P7 P6 P5 P4 P3 P2 P1 P0

P2OUT P7 P6 P5 P4 P3 P2 P1 P0

Valor de la señal digital generada


en el pin 1 del puerto E/S P2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.10
2. Operación – 2.1. Entrada y salida digital

─ Diagrama de bloques: Entrada digital

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.11
2. Operación – 2.1. Entrada y salida digital

─ Diagrama de bloques: Salida digital

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.12
2. Operación – 2.1. Entrada y salida digital

─ Características eléctricas: Entrada digital

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.13
2. Operación – 2.1. Entrada y salida digital

─ Características eléctricas: Entrada digital

PxIN.y
Vhys
‘1’

‘0’
VIT- VIT+

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.14
2. Operación – 2.1. Entrada y salida digital

─ Características eléctricas: Salida digital

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.15
2. Operación – 2.1. Entrada y salida digital

─ Características eléctricas: Salida digital

MUY IMPORTANTE

MUY IMPORTANTE

NOTA: La corriente máxima que puede suministrar (IOHmax) o absorber (IOLmax) cada pin es de 6 mA
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.16
2. Operación – 2.2. Resistencias de pullup y pulldown

2.2. Resistencias de pullup y pulldown


─ Cada pin de los puertos E/S P1 y P2 dispone de una resistencia que se puede
habilitar mediante los bits de los registros P1REN y P2REN respectivamente:
• Bit Px = 0  Resistencia del pin Px deshabilitada
• Bit Px = 1  Resistencia del pin Px habilitada

Habilitación de la resistencia
del pin 3 del puerto E/S P1

P1REN P7 P6 P5 P4 P3 P2 P1 P0

P2REN P7 P6 P5 P4 P3 P2 P1 P0

Habilitación de la resistencia
del pin 1 del puerto E/S P2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.17
2. Operación – 2.2. Resistencias de pullup y pulldown

─ La configuración de las resistencias de los puertos E/S P1 y P2 una vez


habilitadas se puede configurar mediante los bits de los registros P1OUT y
P2OUT respectivamente:
• Bit Px = 0  Resistencia de pulldown en el pin Px
• Bit Px = 1  Resistencia de pullup en el pin Px

Configuración de la resistencia
del pin 3 del puerto E/S P1

P1OUT P7 P6 P5 P4 P3 P2 P1 P0

P2OUT P7 P6 P5 P4 P3 P2 P1 P0

Configuración de la resistencia
del pin 1 del puerto E/S P2

NOTA: La habilitación de las resistencias de pullup y pulldown tiene sentido cuando el pin está configurado como entrada
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.18
2. Operación – 2.2. Resistencias de pullup y pulldown

─ Diagrama de bloques: Resistencia deshabilitada

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.19
2. Operación – 2.2. Resistencias de pullup y pulldown

─ Diagrama de bloques: Resistencia habilitada como pulldown

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.20
2. Operación – 2.2. Resistencias de pullup y pulldown

─ Diagrama de bloques: Resistencia habilitada como pullup

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.21
2. Operación – 2.2. Resistencias de pullup y pulldown

─ Características eléctricas: Resistencias de pullup y pulldown

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.22
2. Operación – 2.3. Oscilación

2.3. Oscilación
─ Cada pin de los puertos E/S P1 y P2 posee la capacidad de producir
oscilaciones cuya frecuencia depende de la capacidad de carga del pin
─ Las oscilaciones que se generan en un pin se pueden utilizar internamente
como señal de reloj de determinados temporizadores, lo que permite realizar
medidas de la frecuencia generada y con ello de la capacidad de carga del pin
─ Esta funcionalidad es especialmente útil para realizar medidas sobre sensores
capacitivos (como pueden ser sensores táctiles)

NOTA: Para seleccionar en un pin la funcionalidad de oscilación se deben modificar los registros P1SEL, P1SEL2 o P2SEL,
P2SEL2
NOTA: Al seleccionar en un pin la funcionalidad de oscilación se deshabilitan automáticamente el resto de funcionalidades
en dicho pin
NOTA: No se puede habilitar la funcionalidad de oscilación en más de un pin del dispositivo simultáneamente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.23
2. Operación – 2.3. Oscilación

─ Diagrama de bloques: Generación de oscilaciones

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.24
2. Operación – 2.3. Oscilación

─ Características eléctricas: Frecuencia de oscilación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.25
2. Operación – 2.3. Oscilación

─ Ejemplo: Touch Pad


• Al acercar el dedo al contacto (pad) del circuito integrado aumenta la
capacidad de carga del pin, por lo que la frecuencia de oscilación disminuye
• Utilizando un temporizador se puede detectar el cambio en la frecuencia de
oscilación, y con ello deducir que se ha acercado un dedo al contacto del
circuito integrado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.26
2. Operación – 2.4. Interrupciones

2.4. Interrupciones
─ Características:
• Sólo los pines de los puertos E/S P1 y P2 pueden generar interrupciones
• Se generan interrupciones al detectar cambios de nivel en la señal digital
conectada al pin
• Se puede seleccionar el cambio de nivel en la señal digital que se desea
detectar (flanco de subida o de bajada)
• Todos los pines de un mismo puerto E/S comparten la misma interrupción(1)

(1) Cada una de estas interrupciones posee múltiples fuentes (ocho fuentes correspondientes a los pines de cada puerto
E/S), lo que implica que hay que inicializar el flag de cada interrupción a ‘0’ manualmente en la Rutina de Tratamiento de
Interrupción
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.27
2. Operación – 2.4. Interrupciones

Interrupción
puerto E/S P2

Interrupción
puerto E/S P1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.28
2. Operación – 2.4. Interrupciones – 2.4.1. Habilitación de interrupciones

2.4.1. Habilitación de interrupciones


─ Cada pin de los puertos E/S P1 y P2 puede generar una interrupción, la cual
se puede habilitar mediante los bits de los registros P1IE y P2IE
respectivamente:
• Bit Px = 0  Interrupción del pin Px deshabilitada
• Bit Px = 1  Interrupción del pin Px habilitada

Habilitación de la interrupción
del pin 3 del puerto E/S P1

P1IE P7 P6 P5 P4 P3 P2 P1 P0

P2IE P7 P6 P5 P4 P3 P2 P1 P0

Habilitación de la interrupción
del pin 1 del puerto E/S P2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.29
2. Operación – 2.4. Interrupciones – 2.4.1. Habilitación de interrupciones

─ El cambio de nivel que genera la interrupción de los puertos E/S P1 y P2 una


vez habilitada se puede configurar mediante los bits de los registros P1IES y
P2IES respectivamente:
• Bit Px = 0  Flanco de subida en el pin Px
• Bit Px = 1  Flanco de bajada en el pin Px

Selección del flanco de la interrupción


del pin 3 del puerto E/S P1

P1IES P7 P6 P5 P4 P3 P2 P1 P0

P2IES P7 P6 P5 P4 P3 P2 P1 P0

Selección del flanco de la interrupción


del pin 1 del puerto E/S P2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.30
2. Operación – 2.4. Interrupciones – 2.4.1. Habilitación de interrupciones

─ Diagrama de bloques: Habilitación de interrupciones

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.31
2. Operación – 2.4. Interrupciones – 2.4.2. Flags de interrupción

2.4.2. Flags de interrupción


─ El estado de la interrupción por la ocurrencia del cambio de nivel seleccionado
en cada pin de los puertos E/S P1 y P2 se indica mediante los bits de los
registros P1IFG y P2IFG respectivamente:
• Bit Px = 0  Interrupción no pendiente en el pin Px
• Bit Px = 1  Interrupción pendiente en el pin Px

Estado de la interrupción
del pin 3 del puerto E/S P1

P1IFG P7 P6 P5 P4 P3 P2 P1 P0

P2IFG P7 P6 P5 P4 P3 P2 P1 P0

Estado de la interrupción
del pin 1 del puerto E/S P2

NOTA: Al modificar los registros P1DIR, P2DIR, P1OUT, P2OUT, P1IES o P2IES se pueden activar los correspondientes
flags de interrupción en los registros P1IFG y P2IFG, por lo que es recomendable inicializar a ‘0’ dichos flags tras
modificar alguno de los registros indicados
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.32
2. Operación – 2.4. Interrupciones – 2.4.2. Flags de interrupción

─ Diagrama de bloques: Flags de interrupción

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.33
2. Operación – 2.5. Funcionalidad

2.5. Funcionalidad

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.34
2. Operación – 2.5. Funcionalidad

─ La funcionalidad de cada pin de los puertos E/S P1 y P2 puede seleccionarse


mediante los bits de los registros P1SEL, P1SEL2 y P2SEL, P2SEL2
respectivamente:

Puerto E/S

Oscilación Depende del dispositivo

─ Adicionalmente, la funcionalidad de cada pin de los puertos E/S P1 y P2


también está determinada por el valor de los bits de los registros de
configuración de otros periféricos E/S

NOTA: Al seleccionar en un pin una funcionalidad distinta a la de entrada y salida digital se deshabilita automáticamente la
interrupción asociada a dicho pin, independientemente del valor de los registros P1IE y P2IE
NOTA: Al seleccionar la funcionalidad de cada pin no se actualiza automáticamente la dirección (entrada o salida)
correspondiente a dicha funcionalidad, por lo que es necesario indicarla mediante los bits de los registros P1DIR y
P2DIR
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.35
2. Operación – 2.5. Funcionalidad

─ Puerto E/S P1:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.36
2. Operación – 2.5. Funcionalidad

─ Puerto E/S P2:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.37
2. Operación – 2.5. Funcionalidad

─ Puerto E/S P2: XIN – XOUT

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.38
2. Operación – 2.5. Funcionalidad

─ Diagrama de bloques: Funcionalidad

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.39
Índice

1. Introducción
2. Operación
2.1. Entrada y salida digital
2.2. Resistencias de pullup y
pulldown
2.3. Oscilación
2.4. Interrupciones
2.4.1. Habilitación de
interrupciones
2.4.2. Flags de interrupción
2.5. Funcionalidad
3. Configuración
4. Ejemplos
4.1. Pulsador
4.2. LED

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.40
3. Configuración

3. Configuración

Estado inicial de cada registro de


configuración
NOTA: Para reducir el consumo se recomienda que los pines no utilizados se configuren como salidas o como entradas con
las resistencias de pullup o pulldown habilitadas, de forma que no se dejen pines de entrada sin conectar susceptibles
de generar fluctuaciones
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.41
3. Configuración

P1  P1.0-P1.7: Puerto E/S – Entrada


P2  P2.0-P2.5: Puerto E/S – Entrada
P2  P2.6-P2.7: XIN – XOUT
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.42
3. Configuración

P2  Interrupciones deshabilitadas
P1  Interrupciones deshabilitadas
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.43
3. Configuración

P2  Flags interrupción desactivados


P1  Flags interrupción desactivados
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.44
Índice

1. Introducción
2. Operación
2.1. Entrada y salida digital
2.2. Resistencias de pullup y
pulldown
2.3. Oscilación
2.4. Interrupciones
2.4.1. Habilitación de
interrupciones
2.4.2. Flags de interrupción
2.5. Funcionalidad
3. Configuración
4. Ejemplos
4.1. Pulsador
4.2. LED

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.45
4. Ejemplos

4. Ejemplos
─ Entrada y salida básica: entre los elementos más comunes que se suelen
utilizar con los puertos E/S se encuentran:
• Pulsador: utilizado como interfaz de entrada con el usuario
• LED: utilizado como interfaz de salida con el usuario

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.46
4. Ejemplos – 4.1. Pulsador

4.1. Pulsador
• Tensión no pulsado: VP1.0 = VCC = 3.5 V
• Tensión pulsado: VP1.0 = GND = 0 V
• Presionar: Flanco de bajada
• Soltar: Flanco de subida

// Utilización de un pulsador en el pin P1.0

P1DIR_bit.P0 = 0; // P1.0 -> Entrada


P1REN_bit.P0 = 1; // P1.0 -> Habilitar resistencia
P1OUT_bit.P0 = 1; // P1.0 -> Resistencia pullup
P1IFG_bit.P0 = 0; // P1.0 -> Limpiar flag interrupción
P1IES_bit.P0 = 1; // P1.0 -> Flanco bajada (presionar)
P1IE_bit.P0 = 1; // P1.0 -> Habilitar interrupción
...
#pragma vector = PORT1_VECTOR
__interrupt void RTI_Port1(void) {
...
P1IFG_bit.P0 = 0; // P1.0 -> Limpiar flag interrupción
...
}

NOTA: La placa LaunchPad está alimentada con una tensión de 3.5 V


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.47
4. Ejemplos – 4.2. LED

4.2. LED
• Corriente diodo máxima: ID ~ 5 mA < 6 mA = IOHmax
• Tensión diodo: VD ~ 2 V
• Tensión salida máxima: VOHmax = VCC = 3.5 V
• Resistencia: VOHmax = ID ∙ R + VD  R = 300 Ω ~ 270 Ω
• Corriente diodo típica: VOHtyp ~ 3.2 V  ID ~ 4.44 mA

// Utilización de un LED en el pin P1.0

P1DIR_bit.P0 = 1; // P1.0 -> Salida


...
P1OUT_bit.P0 = 0; // P1.0 -> Apagar LED
P1OUT_bit.P0 = 1; // P1.0 -> Encender LED
P1OUT_bit.P0 = ~(P1OUT_bit.P0); // P1.0 -> Conmutar LED

NOTA: La placa LaunchPad está alimentada con una tensión de 3.5 V


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T5.48
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 6:
Temporizadores

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.0
Índice

1. Introducción 2.2. Utilización


2.2.1. Ascendente
2. Timers a) Medida de tiempos
2.1. Operación b) Generación de PWMs
2.2.2. Continuo
2.1.1. Contador
a) Medida de tiempos
a) Funcionamiento
b) Modos de operación 2.2.3. Ascendente/Descendente
c) Inicialización a) Medida de tiempos
d) Activación y desactivación b) Generación de PWMs
e) Cambio de configuración 2.3. Configuración
2.1.2. Captura/Comparación
a) Aspectos básicos 3. Watchdog
b) Captura
c) Comparación 3.1. Operación
2.1.3. Unidad de salida 3.1.1. Control
a) Aspectos básicos a) Aspectos básicos
b) Modos de salida b) Modos de operación
c) Inicialización
2.1.4. Interrupciones
d) Activación y desactivación
a) Habilitación de interrupciones
e) Cambio de configuración
b) Flags de interrupción
c) Atención de interrupciones 3.1.2. Contador
a) Funcionamiento
b) Tiempo de expiración
c) Inicialización

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.1
Índice

3.1.3. Interrupciones
a) Habilitación de interrupciones
b) Flags de interrupción

3.2. Configuración
4. Ejemplos
4.1. Antirrebote
4.2. Medición
4.3. Eventos
4.4. PWM

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.2
Índice

1. Introducción 2.2. Utilización


2.2.1. Ascendente
2. Timers a) Medida de tiempos
2.1. Operación b) Generación de PWMs
2.2.2. Continuo
2.1.1. Contador
a) Medida de tiempos
a) Funcionamiento
b) Modos de operación 2.2.3. Ascendente/Descendente
c) Inicialización a) Medida de tiempos
d) Activación y desactivación b) Generación de PWMs
e) Cambio de configuración 2.3. Configuración
2.1.2. Captura/Comparación
a) Aspectos básicos 3. Watchdog
b) Captura
c) Comparación 3.1. Operación
2.1.3. Unidad de salida 3.1.1. Control
a) Aspectos básicos a) Aspectos básicos
b) Modos de salida b) Modos de operación
c) Inicialización
2.1.4. Interrupciones
d) Activación y desactivación
a) Habilitación de interrupciones
e) Cambio de configuración
b) Flags de interrupción
c) Atención de interrupciones 3.1.2. Contador
a) Funcionamiento
b) Tiempo de expiración
c) Inicialización

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.3
1. Introducción

1. Introducción
MSP430G2533 (encapsulado de 20 pines):

Watchdog Timers

NOTA: En la placa LaunchPad se utiliza el encapsulado de 20 pines


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.4
1. Introducción

─ Funcionalidad: los temporizadores permiten controlar el paso del tiempo en el


sistema. Existen dos tipos distintos de temporizadores:
• Timers: temporizadores altamente versátiles que posibilitan:
- Generar eventos: útil para provocar interrupciones transcurrido un
determinado intervalo de tiempo (que se puede repetir periódicamente)
para gestionar los recursos del sistema
- Medir intervalos de tiempo: útil para medir el tiempo transcurrido
entre eventos consecutivos
- Generar señales digitales: útil para crear PWMs(1) en los pines del
microcontrolador
• Watchdog: temporizador específico que posibilita:
- Controlar bloqueos software: útil para generar un reset (PUC) tras la
expiración del tiempo del temporizador
- Generar eventos: útil para provocar interrupciones transcurrido un
determinado intervalo de tiempo (que se puede repetir periódicamente)
para gestionar los recursos del sistema

(1) Un PWM (Pulse Width Modulation) es una onda cuadrada modulada en anchura, donde se puede variar tanto su ciclo de
trabajo (relación entre la duración de la onda a nivel alto y la duración total de la onda) como su frecuencia. Constituyen
señales muy útiles en electrónica, pues permiten el control de numerosos dispositivos (altavoces, motores…)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.5
Índice

1. Introducción 2.2. Utilización


2.2.1. Ascendente
2. Timers a) Medida de tiempos
2.1. Operación b) Generación de PWMs
2.2.2. Continuo
2.1.1. Contador
a) Medida de tiempos
a) Funcionamiento
b) Modos de operación 2.2.3. Ascendente/Descendente
c) Inicialización a) Medida de tiempos
d) Activación y desactivación b) Generación de PWMs
e) Cambio de configuración 2.3. Configuración
2.1.2. Captura/Comparación
a) Aspectos básicos 3. Watchdog
b) Captura
c) Comparación 3.1. Operación
2.1.3. Unidad de salida 3.1.1. Control
a) Aspectos básicos a) Aspectos básicos
b) Modos de salida b) Modos de operación
c) Inicialización
2.1.4. Interrupciones
d) Activación y desactivación
a) Habilitación de interrupciones
e) Cambio de configuración
b) Flags de interrupción
c) Atención de interrupciones 3.1.2. Contador
a) Funcionamiento
b) Tiempo de expiración
c) Inicialización

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.6
2. Timers

2. Timers
─ Existen 2 Timers iguales de 16 bits en el MSP430G2533:

Tipo A

Timer 0 Timer 1

3 Registros
Captura/Comparación (CC)

NOTA: La familia MSP430 posee dos tipos de Timers: Tipo A y Tipo B. Ambos son equivalentes, aunque los de Tipo B son
algo más versátiles al ofrecer algunas características adicionales a los de Tipo A
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.7
2. Timers – 2.1. Operación

2.1. Operación
─ Cada Timer está compuesto por los siguientes elementos básicos:
• Contador (x1): contiene un registro de 16 bits (TAR) que almacena el valor
de la cuenta:
- Permite seleccionar la señal de reloj para su funcionamiento
- Dispone de 3 modos de operación
• Captura/Comparación (x3): contiene un registro de 16 bits (TACCRx ;
x={0,1,2}) que en combinación con TAR implementa las siguientes
funcionalidades del Timer:
- Permite almacenar el valor actual de la cuenta al detectar
determinados eventos
- Permite comprobar el valor actual de la cuenta para generar
determinados eventos
• Unidad de Salida (x3): contiene un módulo de salida (OUTx ; x={0,1,2}) que
en combinación con TAR y TACCRx implementa las siguientes
funcionalidades del Timer:
- Permite generar señales digitales en los pines del microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.8
2. Timers – 2.1. Operación

─ Esquema general:

Contador

Captura/Comparación 0

Unidad de Salida 0

Captura/Comparación 1

Unidad de Salida 1

Captura/Comparación 2

Unidad de Salida 2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.9
2. Timers – 2.1. Operación

─ Diagrama de bloques:

Contador TAR

TACCRx
Captura/Comparación

OUTx
Unidad de Salida

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.10
2. Timers – 2.1. Operación – 2.1.1. Contador

2.1.1. Contador
─ Para describir la operación del contador es necesario considerar los siguientes
aspectos:
• Funcionamiento: mecanismo de actualización de la cuenta
• Modos de operación: esquemas disponibles para realizar la cuenta
• Inicialización: establecimiento del estado inicial del contador
• Activación y desactivación: puesta en marcha y detención del contador
• Cambio de configuración: modificación del funcionamiento del contador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.11
2. Timers – 2.1. Operación – 2.1.1. Contador – a) Funcionamiento

a) Funcionamiento
─ El registro TAR incrementa/decrementa su valor (en función del modo de
operación) en cada flanco de subida de la señal de reloj que lo controla
─ El contador tiene la capacidad de generar interrupciones durante su
funcionamiento:
• Cuenta: el flag de interrupción TAIFG del registro TACTL se activa cuando
el valor de la cuenta del registro TAR vuelve a 0x0000(1)

(1) Este flag de interrupción se activa cuando el Timer se encuentra funcionando y el valor de la cuenta del registro TAR
alcanza 0x0000, pero no se activa si se escribe directamente el valor 0x0000 en el registro TAR
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.12
2. Timers – 2.1. Operación – 2.1.1. Contador – a) Funcionamiento

─ La señal de reloj que controla el registro TAR se obtiene mediante:


• Señal de reloj fuente: los bits TASSEL0 y TASSEL1 del registro TACTL
permiten seleccionar la señal de reloj fuente para controlar el registro TAR
• Divisor: los bits ID0 y ID1 del registro TACTL permiten dividir la señal de
reloj fuente para generar la señal de reloj que controla el registro TAR

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.13
2. Timers – 2.1. Operación – 2.1.1. Contador – a) Funcionamiento

─ Diagrama de bloques:

Externa
Interna
Interna
Externa

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.14
2. Timers – 2.1. Operación – 2.1.1. Contador – a) Funcionamiento

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.15
2. Timers – 2.1. Operación – 2.1.1. Contador – b) Modos de operación

b) Modos de operación
─ Los bits MC0 y MC1 del registro TACTL permiten seleccionar el modo de
operación del registro TAR:
• MCx = 00  Timer detenido
• MCx ≠ 00  Timer funcionando:
- Modo ascendente
- Modo continuo
- Modo ascendente/descendente

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.16
2. Timers – 2.1. Operación – 2.1.1. Contador – b) Modos de operación

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.17
2. Timers – 2.1. Operación – 2.1.1. Contador – b) Modos de operación

─ Modo ascendente (Up): el registro TAR cuenta repetidamente desde 0 hasta el


valor almacenado en el registro TACCR0:
• Cuenta (TACCR0+1) ciclos de la señal de reloj
• Al utilizar el registro TACCR0 para su funcionamiento no se puede utilizar
para otras funcionalidades
• Este modo de operación es útil para generar intervalos de tiempo de
(TACCR0+1) ciclos de duración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.18
2. Timers – 2.1. Operación – 2.1.1. Contador – b) Modos de operación

─ Modo continuo (Continuous): el registro TAR cuenta repetidamente desde 0


hasta 0xFFFF (valor máximo del registro TAR):
• Cuenta (0x10000 = 65536) ciclos de la señal de reloj
• Al no utilizar el registro TACCR0 para su funcionamiento se puede utilizar
para otras funcionalidades
• Este modo de operación es útil para generar distintos intervalos de tiempo
independientes, utilizando para ello los registros TACCRx

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.19
2. Timers – 2.1. Operación – 2.1.1. Contador – b) Modos de operación

─ Modo ascendente/descendente (Up/Down): el registro TAR cuenta


repetidamente desde 0 hasta el valor almacenado en el registro TACCR0 (cuenta
ascendente) y de nuevo hasta 0 (cuenta descendente):
• Cuenta (2xTACCR0) ciclos de la señal de reloj
• Al utilizar el registro TACCR0 para su funcionamiento no se puede utilizar
para otras funcionalidades
• Este modo de operación es útil para generar ondas cuadradas que no se
solapen(1) en combinación con la unidad de salida OUTx

(1) Este tipo de señales son utilizadas, por ejemplo, en el control de motores mediante puentes en H, donde la propia inercia
del motor requiere de un tiempo de inactividad sin generar ninguna señal hasta que se detenga por completo
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.20
2. Timers – 2.1. Operación – 2.1.1. Contador – b) Modos de operación

Puente en H

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.21
2. Timers – 2.1. Operación – 2.1.1. Contador – c) Inicialización

c) Inicialización
─ El contador se inicializa poniendo a ‘1’ el bit TACLR(1) del registro TACTL:
• Inicializa la cuenta a 0 escribiendo un 0x0000 en el registro TAR
• Inicializa la cuenta del divisor(2)
• Inicializa la dirección de la cuenta a ascendente en el modo de operación
ascendente/descendente

─ Alternativamente, también es posible inicializar únicamente la cuenta a un


valor determinado escribiendo dicho valor directamente en el registro TAR

(1) El bit TACLR se pone automáticamente a ‘0’ tras inicializar el contador


(2) El divisor se implementa mediante un contador que conmuta su salida cada vez que se cuentan el número de ciclos
establecidos
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.22
2. Timers – 2.1. Operación – 2.1.1. Contador – c) Inicialización

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.23
2. Timers – 2.1. Operación – 2.1.1. Contador – d) Activación y desactivación

d) Activación y desactivación
─ El contador comienza su funcionamiento cuando se cumplen todas y cada
una de las siguientes condiciones:
• La señal de reloj fuente está activa
• El modo de operación es distinto de 00: MCx ≠ 00
• En el modo de operación ascendente o ascendente/descendente el valor
del registro TACCR0 es distinto de 0x0000: TACCR0 ≠ 0x0000
─ El contador detiene su funcionamiento cuando se cumple alguna de las
siguientes condiciones:
• La señal de reloj fuente está inactiva
• El modo de operación es igual a 00: MCx = 00
• En el modo de operación ascendente o ascendente/descendente el valor
del registro TACCR0 es igual a 0x0000: TACCR0 = 0x0000

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.24
2. Timers – 2.1. Operación – 2.1.1. Contador – d) Activación y desactivación

─ Características:
• Al detener el contador se mantiene el estado(1) actual del mismo, de forma
que al reanudar su funcionamiento continúa su operación a partir de dicho
estado
• Si se detiene el contador escribiendo el valor 0x0000 en el registro
TACCR0, al reanudar su funcionamiento escribiendo un valor distinto en el
registro TACCR0 se inicializa la dirección de la cuenta a ascendente en el
modo de operación ascendente/descendente

(1) El estado del contador está determinado por: señal de reloj fuente, divisor, valor de la cuenta, modo de operación,
dirección de la cuenta (ascendente o descendente) en el modo de operación ascendente/descendente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.25
2. Timers – 2.1. Operación – 2.1.1. Contador – e) Cambio de configuración

e) Cambio de configuración
─ Antes de modificar la configuración del contador es recomendable detener el
Timer, para evitar operaciones erróneas
─ Modificar el modo de operación mientras el Timer está funcionando tiene las
siguientes consecuencias(1):
• Modo ascendente:
- TAR > TACCR0  TAR se inicializa a 0x0000
• Modo ascendente/descendente:
- TACCR0 > TAR  cuenta ascendente: TAR incrementa hasta TACCR0
- TACCR0 ≤ TAR  cuenta descendente: TAR decrementa hasta 0x0000

(1) En estas condiciones es posible que se produzca una cuenta adicional antes de que el cambio tenga efecto
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.26
2. Timers – 2.1. Operación – 2.1.1. Contador – e) Cambio de configuración

─ Modificar el valor del registro TACCR0 mientras el Timer está funcionando


tiene las siguientes consecuencias(1):
• Modo ascendente:
- TACCR0 > TAR  TAR incrementa hasta TACCR0
- TACCR0 ≤ TAR  TAR se inicializa a 0x0000
• Modo ascendente/descendente:
- Ascendente y TACCR0 > TAR  TAR incrementa hasta TACCR0
- Ascendente y TACCR0 ≤ TAR  TAR decrementa hasta 0x0000
- Descendente  TAR decrementa hasta 0x0000

(1) En estas condiciones es posible que se produzca una cuenta adicional antes de que el cambio tenga efecto
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.27
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación

2.1.2. Captura/Comparación
─ Para describir la operación de los procesos de captura y comparación es
necesario considerar los siguientes aspectos:
• Aspectos básicos: consideraciones generales de los procesos de captura y
comparación
• Captura: descripción del proceso de captura
• Comparación: descripción del proceso de comparación

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.28
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – a) Aspectos básicos

a) Aspectos básicos
─ Los procesos de captura y comparación utilizan para su funcionamiento los
registros TAR y TACCRx
─ El registro TACCRx tiene distinta funcionalidad según se utilice durante el
proceso de captura o durante el proceso de comparación
─ Los procesos de captura y comparación generan durante su funcionamiento la
señal interna EQUx(1), que está activa mientras: TACCRx = TAR
─ El bit CAP del registro TACCTLx permite configurar el Timer en el modo
captura o en el modo comparación:
• CAP = 0  Timer en modo comparación
• CAP = 1  Timer en modo captura

(1) La señal EQUx es necesaria para la operación de la unidad de salida


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.29
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – a) Aspectos básicos

─ Los procesos de captura y comparación tienen la capacidad de generar


interrupciones durante su funcionamiento:
• Captura: el flag de interrupción CCIFG del registro TACCTLx se activa
cuando se produce una nueva captura
• Comparación: el flag de interrupción CCIFG del registro TACCTLx se
activa cuando el valor de la cuenta del registro TAR alcanza el valor del
registro TACCRx

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.30
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – a) Aspectos básicos

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.31
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

b) Captura
─ El proceso de captura se utiliza para registrar (capturar) el instante de tiempo
(valor de la cuenta del registro TAR) en el que ocurren determinados eventos
─ Los eventos que se pueden detectar son los cambios de nivel (flancos) de
determinadas señales, que pueden ser externas o internas al microcontrolador:
• Señal: los bits CCIS0 y CCIS1 del registro TACCTLx permiten seleccionar
la señal a capturar
• Flanco: los bits CM0 y CM1 del registro TACCTLx permiten seleccionar el
flanco a detectar

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.32
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Diagrama de bloques:

Externa
Externa
Interna
Interna

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.33
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.34
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Puesto que las señales externas pueden ser asíncronas respecto a la señal de
reloj del Timer, es recomendable sincronizar su captura con el reloj del Timer
para evitar operaciones erróneas:
• Nivel instantáneo de la señal: el bit CCI del registro TACCTLx contiene el
valor digital instantáneo de la señal a capturar
• Sincronización: el bit SCS del registro TACCTLx permite activar la
sincronización de la señal a capturar con el reloj del Timer
• Nivel sincronizado de la señal: el bit SCCI del registro TACCTLx contiene
el valor digital sincronizado de la señal a capturar

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.35
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Diagrama de bloques:

Externa
Externa

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.36
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

Sincronización incorrecta Sincronización correcta


(valor de la cuenta cambiando) (valor de la cuenta estable)

NOTA: La sincronización con la señal de reloj del Timer se debe realizar en el flanco de bajada de dicha señal, pues en ese
momento el valor de la cuenta del registro TAR ya está estabilizado y se puede copiar en el registro TACCRx. Si se
realiza la sincronización en el flanco de subida de la señal de reloj del Timer el valor de la cuenta del registro TAR se
está modificando, por lo que su copia en el registro TACCRx puede almacenar valores incorrectos
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.37
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Las señales internas pueden utilizarse para generar una captura software
modificando el bit CCIS0(1) (2) del registro TACCTLx:
• CCISx = 10  CCIS1 = 1 ; CCIS0 = 0  Señal GND
• CCISx = 11  CCIS1 = 1 ; CCIS0 = 1  Señal VCC

(1) Para realizar una captura software hay que mantener el bit CCIS1 del registro TACCTLx a ‘1’
(2) Si se desea realizar una captura software cada vez que se modifica el bit CCIS0 hay que seleccionar la detección de
ambos flancos mediante CMx = 11
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.38
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Diagrama de bloques:

Interna
Interna

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.39
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Cuando se produce una captura se realizan las siguientes operaciones:


• TACCRx = TAR: se almacena en el registro TACCRx el instante de tiempo
(valor de la cuenta del registro TAR) en el que se ha detectado el evento
• EQUx = 1: se activa la señal interna EQUx
• CCIFG = 1: se activa el flag de interrupción CCIFG del registro TACCTLx
─ El proceso de captura se puede utilizar para medir el tiempo transcurrido
entre eventos consecutivos, restando(1) los valores almacenados en el registro
TACCRx correspondientes a cada captura

(1) En este cálculo hay que gestionar adecuadamente el desbordamiento de la cuenta del registro TAR
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.40
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ El proceso de captura dispone de un mecanismo de desbordamiento que


detecta cuando se produce una nueva captura que sobreescribe el valor
almacenado en el registro TACCRx de la captura anterior antes de ser leído.
Para ello se utiliza el bit COV(1) del registro TACCTLx:

(1) Una vez activado, el bit COV del registro TACCTLx debe ser inicializado a ‘0’ manualmente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.41
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – b) Captura

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.42
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – c) Comparación

c) Comparación
─ El proceso de comparación se utiliza para comprobar (comparar) si el valor de
la cuenta (almacenado en el registro TAR) coincide con un valor establecido
(almacenado en el registro TACCRx), y si es así generar ciertos eventos
(interrupciones)
─ Cuando el valor de la cuenta del registro TAR coincide con el valor establecido
del registro TACCRx se realizan las siguientes operaciones:
• SCCI = CCI: se almacena el valor digital sincronizado de la señal
determinada por los bits CCIS0 y CCIS1 del registro TACCTLx
• EQUx = 1: se activa la señal interna EQUx
• CCIFG = 1: se activa el flag de interrupción CCIFG del registro TACCTLx

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.43
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – c) Comparación

─ Modo ascendente:
• Cada vez que la cuenta del registro TAR alcanza el valor de TACCR0 se
genera una interrupción (TACCR0 CCIFG)

• Utilizando el registro TACCR0 se puede generar 1 interrupción periódica

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.44
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – c) Comparación

─ Modo continuo:
• Cada vez que la cuenta del registro TAR alcanza el valor de TACCRx se
genera una interrupción (TACCRx CCIFG), y en la correspondiente Rutina
de Tratamiento de Interrupción (RTI) se debe calcular y actualizar el
siguiente valor de TACCRx en función del intervalo de tiempo tx deseado:
- Inicialización : TACCRx(1) = TAR + (tx)
- Actualización : TACCRx(i+1) = TACCRx(i) + (tx)

• Utilizando los registros TACCR0, TACCR1 y TACCR2 se pueden generar 3


interrupciones periódicas distintas: t0, t1, t2
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.45
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – c) Comparación

─ Modo ascendente/descendente:
• Cada vez que la cuenta del registro TAR alcanza el valor de TACCR0 se
genera una interrupción (TACCR0 CCIFG)

• Utilizando el registro TACCR0 se puede generar 1 interrupción periódica

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.46
2. Timers – 2.1. Operación – 2.1.2. Captura/Comparación – c) Comparación

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.47
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida

2.1.3. Unidad de salida


─ Para describir la operación de la unidad de salida es necesario considerar los
siguientes aspectos:
• Aspectos básicos: consideraciones generales de la unidad de salida
• Modos de salida: esquemas disponibles para generar la señal de salida

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.48
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – a) Aspectos básicos

a) Aspectos básicos
─ La unidad de salida utiliza para su funcionamiento los registros TAR y TACCRx,
junto con las señales internas EQU0 y EQUx
─ La unidad de salida permite generar señales digitales(1) en las señales OUTx
del Timer, las cuales pueden estar conectadas con distintos pines(2) del
microcontrolador

(1) Entre estas señales digitales que se pueden generar se encuentran los PWMs
(2) Los pines del microcontrolador conectados con las señales OUTx de las unidades de salida de los Timers se identifican
con la nomenclatura TA0.x (señal OUTx del Timer A número 0) y TA1.x (señal OUTx del Timer A número 1)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.49
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – a) Aspectos básicos

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.50
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – a) Aspectos básicos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.51
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

b) Modos de salida
─ Cada unidad de salida dispone de 8 modos de salida para generar la señal
OUTx
─ Los bits OUTMOD0, OUTMOD1 y OUTMOD2 del registro TACCTLx permiten
seleccionar el modo de salida de la señal OUTx:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.52
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

─ Contador en modo de operación ascendente:

TAR = 0  ERRATA
EQUx  TAR = TACCRx

TAIFGTAR
EQU0 TAR==TACCR0
0x0000

EQU0 = EQUx

Modo no válido para la


unidad de salida OUT0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.53
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

─ Contador en modo de operación continuo:

EQUx  TAR = TACCRx

EQU0  TAR = TACCR0

EQU0 = EQUx

Modo no válido para la


unidad de salida OUT0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.54
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

─ Contador en modo de operación ascendente/descendente:

EQUx  TAR = TACCRx

EQU0  TAR = TACCR0

EQU0 = EQUx

Modo no válido para la


unidad de salida OUT0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.55
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

─ Características:
• Modo de salida 0: genera el valor digital en la señal OUTx correspondiente
al bit OUT del registro TACCTLx

• Sincronismo: todos los modos de salida excepto el 0 modifican el valor


digital de la señal OUTx en el flanco de subida de la señal de reloj del
Timer
• Validez: los modos de salida 2, 3, 6 y 7 no son válidos para la unidad de
salida 0 (OUT0), pues en esta unidad de salida: EQUx = EQU0
• Generación PWM: los modos de salida 2, 3, 4, 6 y 7 permiten generar
señales PWM

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.56
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

─ Diagrama de bloques: Modo de salida 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.57
2. Timers – 2.1. Operación – 2.1.3. Unidad de salida – b) Modos de salida

─ Diagrama de bloques: Modos de salida 1..7

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.58
2. Timers – 2.1. Operación – 2.1.4. Interrupciones

2.1.4. Interrupciones
─ Cada Timer dispone de dos interrupciones distintas:
• TACCR0: interrupción con una única fuente(1):
- Captura/Comparación (TACCR0 CCIFG): en modo captura se activa
al producirse una captura en el registro TACCR0, y en modo
comparación se activa al alcanzar el valor de la cuenta del registro TAR
el valor almacenado en el registro TACCR0
• TAIV: interrupción con múltiples fuentes(2):
- Cuenta (TAIFG): al volver el valor de la cuenta del registro TAR a
0x0000
- Captura/Comparación (TACCR1 CCIFG, TACCR2 CCIFG): en modo
captura se activa al producirse una captura en los registros TACCR1 o
TACCR2, y en modo comparación se activa al alcanzar el valor de la
cuenta del registro TAR el valor almacenado en los registros TACCR1
o TACCR2

(1) Al tener una única fuente el flag de interrupción asociado a la misma se inicializa a ‘0’ automáticamente
(2) Aunque posee múltiples fuentes el flag de interrupción asociado a la fuente que ha originado la interrupción se inicializa a
‘0’ automáticamente si se utiliza el registro TAIV para localizar dicha fuente, y si no se utiliza dicho registro el flag de
interrupción asociado a la fuente que ha originado la interrupción se debe inicializar a ‘0’ manualmente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.59
2. Timers – 2.1. Operación – 2.1.4. Interrupciones

Interrupciones
Timer 1

Interrupciones
Timer 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.60
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – a) Habilitación de interrupciones

a) Habilitación de interrupciones
─ Las distintas interrupciones de cada Timer se pueden habilitar mediante:
• Cuenta: la interrupción que indica que el valor de la cuenta del registro TAR
ha vuelto a 0x0000 (TAIFG) se habilita mediante el bit TAIE del registro
TACTL

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.61
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – a) Habilitación de interrupciones

• Captura/Comparación: las interrupciones que en el modo captura indican


que se ha producido una nueva captura en el registro TACCRx, y que en el
modo comparación indican que el valor de la cuenta del registro TAR ha
alcanzado el valor almacenado en el registro TACCRx (TACCRx CCIFG), se
habilitan mediante el bit CCIE del registro TACCTLx

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.62
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – b) Flags de interrupción

b) Flags de interrupción
─ Los flags de interrupción de cada Timer se encuentran en los siguientes
registros:
• Cuenta: el flag TAIFG que indica que el valor de la cuenta del registro TAR
ha vuelto a 0x0000 se encuentra en el registro TACTL

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.63
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – b) Flags de interrupción

• Captura/Comparación: los flags TACCRx CCIFG que en el modo captura


indican que se ha producido una nueva captura en el registro TACCRx, y
que en el modo comparación indican que el valor de la cuenta del registro
TAR ha alcanzado el valor almacenado en el registro TACCRx, se
encuentran en el registro TACCTLx

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.64
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – c) Atención de interrupciones

c) Atención de interrupciones
─ La interrupción TACCR0 posee una única fuente, por lo que la localización de
dicha fuente es inmediata y el correspondiente flag de interrupción se inicializa a
‘0’ automáticamente
─ La interrupción TAIV posee múltiples fuentes, por lo que es necesario localizar
la fuente que ha generado la interrupción e inicializar a ‘0’ el flag de interrupción
correspondiente, para lo cual existen dos mecanismos:
• Directo: consiste en comprobar todos los posibles flags de interrupción
(TAIFG, TACCR1 CCIFG, TACCR2 CCIFG), inicializando manualmente a ‘0’
el flag de interrupción que se haya activado
• Registro TAIV: consiste en acceder al registro TAIV, que contiene un valor
que indica el flag de interrupción de mayor prioridad que se ha activado, el
cual a su vez es inicializado automáticamente a ‘0’ al acceder al registro

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.65
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – c) Atención de interrupciones

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.66
2. Timers – 2.1. Operación – 2.1.4. Interrupciones – c) Atención de interrupciones

─ Gestión del registro TAIV:

Ensamblador C

(1)

(1) El uso de la función intrínseca __even_in_range() genera un código en ensamblador más eficiente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.67
2. Timers – 2.2. Utilización

2.2. Utilización
─ Los temporizadores de los microcontroladores MSP430 poseen distintos modos
de operación, y aunque todos ellos son capaces de realizar medida de tiempos y
generación de PWMs, cada uno tiene sus propias características, haciendo que
algunos modos sean más adecuados que otros para ciertas funcionalidades:
a) Ascendente: útil para realizar medida de tiempos y para generar PWMs
b) Continuo: útil para realizar medida de tiempos avanzadas
c) Ascendente/Descendente: útil para realizar medida de tiempos y para
generar PWMs

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.68
2. Timers – 2.2. Utilización – 2.1.1. Ascendente

2.1.1. Ascendente
─ Las funcionalidades más utilizadas del modo ascendente son:
a) Medida de tiempos: permite realizar medida de tiempos mediante la
generación de una interrupción periódica
b) Generación de PWMs: permite generar PWMs de cualquier frecuencia y
ciclo de trabajo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.69
2. Timers – 2.2. Utilización – 2.1.1. Ascendente – a) Medida de tiempos

a) Medida de tiempos
─ Se realiza indicando el valor correcto en el registro TACCR0:
a) Período:
(TACCR0 + 1) ciclos de la señal de reloj del temporizador
b) Interrupciones:
 TAR = TACCR0
 TAR = 0
─ Ejemplo: TACCR0 = 9

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.70
2. Timers – 2.2. Utilización – 2.1.1. Ascendente – b) Generación de PWMs

b) Generación de PWMs
─ Se realiza utilizando los registros TACCR0 y TACCRx (TACCR1/TACCR2):
a) Período:
(TACCR0 + 1) ciclos de la señal de reloj del temporizador
b) Ciclo de trabajo:(1)
TACCR 0  TACCR x 1
Toggle/Reset  TACCR 0 1

TACCR 0  TACCR x 1
Set/Reset  TACCR 0 1

TACCR x
Toggle/Set  TACCR 0  1

TACCR x
Reset/Set  TACCR 0  1

TACCR 0
(1) El máximo ciclo de trabajo que se puede conseguir es:
TACCR 0  1
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.71
2. Timers – 2.2. Utilización – 2.1.1. Ascendente – b) Generación de PWMs

– Ejemplo: TACCR0 = 9 ; TACCR1 = 3

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.72
2. Timers – 2.2. Utilización – 2.1.2. Continuo

2.1.2. Continuo
─ Las funcionalidades más utilizadas del modo continuo son:
a) Medida de tiempos: permite realizar medida de tiempos mediante la
generación de hasta tres interrupciones periódicas

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.73
2. Timers – 2.2. Utilización – 2.1.2. Continuo – a) Medida de tiempos

a) Medida de tiempos
─ Se realiza actualizando continuamente el valor correcto del registro TACCRx
(TACCR0/TACCR1/TACCR2):
Inicialización : TACCRx (1) TAR  N

Actualización : TACCRx (i1) TACCRx (i) N

a) Período:
(N) ciclos de la señal de reloj del temporizador
b) Interrupciones:
 TAR = TACCRx
 TAR = 0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.74
2. Timers – 2.2. Utilización – 2.1.2. Continuo – a) Medida de tiempos

– Ejemplo: N = 10

TAR  0 TACCR 0 6551 65510


TACCR 0 1 10 TACCR 0 6552 65520
TACCR 0 2 20 TACCR 0 6553 65530
TACCR 0 3 30 TACCR 0 6554 4  65540 65536

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.75
2. Timers – 2.2. Utilización – 2.1.3. Ascendente/Descendente

2.1.3. Ascendente/Descendente
─ Las funcionalidades más utilizadas del modo ascendente/descendente son:
a) Medida de tiempos: permite realizar medida de tiempos mediante la
generación de una interrupción periódica
b) Generación de PWMs: permite generar PWMs de cualquier frecuencia y
ciclo de trabajo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.76
2. Timers – 2.2. Utilización – 2.1.3. Ascendente/Descendente – a) Medida de tiempos

a) Medida de tiempos
─ Se realiza indicando el valor correcto en el registro TACCR0:
a) Periodo(1):
(2 * TACCR0) ciclos de la señal de reloj del temporizador
b) Interrupciones:
 TAR = TACCR0
 TAR = 0
─ Ejemplo: TACCR0 = 5

(1) Sólo se pueden conseguir períodos con un número par de ciclos


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.77
2. Timers – 2.2. Utilización – 2.1.3. Ascendente/Descendente – b) Generación de PWMs

b) Generación de PWMs
─ Se realiza utilizando los registros TACCR0 y TACCRx (TACCR1/TACCR2):
a) Período:(1)
(2 * TACCR0) ciclos de la señal de reloj del temporizador
b) Ciclo de trabajo:
TACCR x
Toggle/Reset(2)  TACCR 0

TACCR 0  TACCR x
Set/Reset(3)  2  TACCR 0

TACCR 0  TACCR x
Toggle/Set(4)  TACCR 0

TACCR 0  TACCR x
Reset/Set(5)  2  TACCR 0

(1) Sólo se pueden conseguir períodos con un número par de ciclos


(2) Sólo se pueden conseguir ciclos de trabajo con un número par de ciclos
(3) Sólo se pueden conseguir ciclos de trabajo ≥ 50 %
(4) Sólo se pueden conseguir ciclos de trabajo con un número par de ciclos
(5) Sólo se pueden conseguir ciclos de trabajo ≤ 50 %
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.78
2. Timers – 2.2. Utilización – 2.1.3. Ascendente/Descendente – b) Generación de PWMs

– Ejemplo: TACCR0 = 5 ; TACCR1 = 3

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.79
2. Timers – 2.2. Utilización – 2.1.3. Ascendente/Descendente – b) Generación de PWMs

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.80
2. Timers – 2.3. Configuración

2.3. Configuración
─ El nombre de los registros de configuración para cada uno de los Timers es:
Timer 0 Timer 1
TACTL = TA0CTL TA1CTL
TAR = TA0R TA1R
TACCTL0 = TA0CCTL0 TA1CCTL0
TACCR0 = TA0CCR0 TA1CCR0
TACCTL1 = TA0CCTL1 TA1CCTL1
TACCR1 = TA0CCR1 TA1CCR1
TACCTL2 = TA0CCTL2 TA1CCTL2
TACCR2 = TA0CCR2 TA1CCR2
TAIV = TA0IV TA1IV

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.81
2. Timers – 2.3. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.82
2. Timers – 2.3. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.83
2. Timers – 2.3. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.84
2. Timers – 2.3. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.85
2. Timers – 2.3. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.86
Índice

1. Introducción 2.2. Utilización


2.2.1. Ascendente
2. Timers a) Medida de tiempos
2.1. Operación b) Generación de PWMs
2.2.2. Continuo
2.1.1. Contador
a) Medida de tiempos
a) Funcionamiento
b) Modos de operación 2.2.3. Ascendente/Descendente
c) Inicialización a) Medida de tiempos
d) Activación y desactivación b) Generación de PWMs
e) Cambio de configuración 2.3. Configuración
2.1.2. Captura/Comparación
a) Aspectos básicos 3. Watchdog
b) Captura
c) Comparación 3.1. Operación
2.1.3. Unidad de salida 3.1.1. Control
a) Aspectos básicos a) Aspectos básicos
b) Modos de salida b) Modos de operación
c) Inicialización
2.1.4. Interrupciones
d) Activación y desactivación
a) Habilitación de interrupciones
e) Cambio de configuración
b) Flags de interrupción
c) Atención de interrupciones 3.1.2. Contador
a) Funcionamiento
b) Tiempo de expiración
c) Inicialización

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.87
Índice

3.1.3. Interrupciones
a) Habilitación de interrupciones
b) Flags de interrupción

3.2. Configuración
4. Ejemplos
4.1. Antirrebote
4.2. Medición
4.3. Eventos
4.4. PWM

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.88
3. Watchdog

3. Watchdog
─ Existe 1 Watchdog de 16 bits en el MSP430G2533:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.89
3. Watchdog – 3.1. Operación

3.1. Operación
─ El Watchdog está compuesto por los siguientes elementos básicos:
• Control: contiene un registro de 16 bits (WDTCTL) que controla la
operación del Watchdog:
- Acceso protegido por clave de seguridad
- Establece la funcionalidad del pin RST/NMI
• Contador: contiene un registro de 16 bits (WDTCNT) que almacena el valor
de la cuenta:
- No es accesible mediante software
- Realiza una cuenta ascendente

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.90
3. Watchdog – 3.1. Operación

─ Diagrama de bloques: WDTCNT WDTCTL

Contador Control

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.91
3. Watchdog – 3.1. Operación – 3.1.1. Control

3.1.1. Control
─ Para describir la operación del proceso de control es necesario considerar los
siguientes aspectos:
• Aspectos básicos: consideraciones generales del control del Watchdog
• Modos de operación: esquemas disponibles para utilizar el Watchdog
• Inicialización: estado inicial del Watchdog
• Activación y desactivación: puesta en marcha y detención del Watchdog
• Cambio de configuración: modificación del funcionamiento del Watchdog

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.92
3. Watchdog – 3.1. Operación – 3.1.1. Control – a) Aspectos básicos

a) Aspectos básicos
─ El registro de control WDTCTL controla toda la funcionalidad del Watchdog
─ Cualquier acceso al registro de control WDTCTL está protegido mediante una
clave de seguridad:
• Hay que escribir el valor 0x5A en el MSB del registro de control WDTCTL
para que se puedan modificar el resto de bits de dicho registro
• Si no se escribre el valor 0x5A en el MSB del registro de control WDTCTL
se genera un reset (PUC) al producirse una violación de la clave de
seguridad
• Este mecanismo permite evitar escrituras erróneas en el registro de
control WDTCTL, para prevenir una configuración incorrecta del
Watchdog, ya que se trata de un periférico crítico en el microcontrolador

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.93
3. Watchdog – 3.1. Operación – 3.1.1. Control – a) Aspectos básicos

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.94
3. Watchdog – 3.1. Operación – 3.1.1. Control – a) Aspectos básicos

─ El registro de control WDTCTL también controla la funcionalidad del pin


RST/NMI del microcontrolador:
• El bit WDTNMI selecciona la funcionalidad del pin cuando se detecta un
cambio de nivel (flanco) en el mismo:
- WDTNMI = 0: se genera un reset (PUC)
- WDTNMI = 1: se genera una interrupción no enmascarable NMI
• El bit WDTNMIES selecciona el flanco activo a detectar en el pin:
- WDTNMIES = 0: flanco de subida
- WDTNMIES = 1: flanco de bajada

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.95
3. Watchdog – 3.1. Operación – 3.1.1. Control – a) Aspectos básicos

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.96
3. Watchdog – 3.1. Operación – 3.1.1. Control – b) Modos de operación

b) Modos de operación
─ El bit WDTTMSEL del registro de control WDTCTL controla el modo de
operación del Watchdog:
• WDTTMSEL = 0: modo Watchdog, que genera un reset (PUC) cuando se
cuenta el número de ciclos programados
• WDTTMSEL = 1: modo Timer, que genera una interrupción (WDTIFG)
cuando se cuenta el número de ciclos programados

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.97
3. Watchdog – 3.1. Operación – 3.1.1. Control – b) Modos de operación

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.98
3. Watchdog – 3.1. Operación – 3.1.1. Control – b) Modos de operación

─ El modo Watchdog se utiliza para realizar un reset (PUC) ante cualquier


bloqueo software:
• Si el software no se bloquea debe inicializar continuamente la cuenta del
registro WDTCNT a 0x0000 antes de que expire el tiempo del Watchdog(1)
• Si el software se bloquea no se inicializará la cuenta del registro
WDTCNT a 0x0000 antes de que expire el tiempo del Watchdog, por lo que
se producirá un reset (PUC)
─ El modo Timer se puede utilizar si el modo Watchdog no es necesario:
• Puede generar una interrupción (WDTIFG) cuando se cuenta el número de
ciclos programados

(1) Esta operación se realiza escribiendo un ‘1’ en el bit WDTCNTCL del registro de control WDTCTL
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.99
3. Watchdog – 3.1. Operación – 3.1.1. Control – c) Inicialización

c) Inicialización
─ Tras el encendido del microcontrolador el Watchdog se configura en el
siguiente estado:
• Funcionamiento: activo
• Modo de operación: modo Watchdog
• Señal de reloj: SMCLK ~ 1.1 MHz
• Número de ciclos a contar: 32768 ciclos
• Tiempo de expiración: ~ 30 ms
• Valor de la cuenta: WDTCNT = 0x0000
• Pin RST/NMI: modo reset

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.100
3. Watchdog – 3.1. Operación – 3.1.1. Control – d) Activación y desactivación

d) Activación y desactivación
─ El Watchdog comienza su funcionamiento (independientemente del modo de
operación) cuando se cumple la siguiente condición:
• El bit WDTHOLD del registro de control WDTCTL se encuentra a ‘0’
─ El Watchdog detiene su funcionamiento (independientemente del modo de
operación) cuando se cumple la siguiente condición:
• El bit WDTHOLD del registro de control WDTCTL se encuentra a ‘1’

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.101
3. Watchdog – 3.1. Operación – 3.1.1. Control – d) Activación y desactivación

─ Diagrama de bloques: Watchdog activado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.102
3. Watchdog – 3.1. Operación – 3.1.1. Control – d) Activación y desactivación

─ Diagrama de bloques: Watchdog desactivado

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.103
3. Watchdog – 3.1. Operación – 3.1.1. Control – e) Cambio de configuración

e) Cambio de configuración
─ Antes de modificar la configuración del Watchdog es recomendable detener
su funcionamiento, para evitar operaciones erróneas
─ También es recomendable configurar el Watchdog con una única instrucción,
que escriba el valor deseado en el registro de control WDTCTL
─ Cualquier cambio de configuración requiere la modificación del registro de
control WDTCTL, para lo cual es imprescindible escribir el valor 0x5A (clave de
seguridad) en el MSB de dicho registro

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.104
3. Watchdog – 3.1. Operación – 3.1.2. Contador

3.1.2. Contador
─ Para describir la operación del contador es necesario considerar los siguientes
aspectos:
• Funcionamiento: mecanismo de actualización de la cuenta
• Tiempo de expiración: programación del número de ciclos a contar
• Inicialización: restablecimiento del valor de la cuenta

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.105
3. Watchdog – 3.1. Operación – 3.1.2. Contador – a) Funcionamiento

a) Funcionamiento
─ El registro WDTCNT incrementa su valor en cada flanco de subida de la
señal de reloj que lo controla
─ El contador tiene la capacidad de generar interrupciones durante su
funcionamiento:
• Cuenta: el flag de interrupción WDTIFG del registro IFG1 se activa cuando
se cuenta el número de ciclos programados

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.106
3. Watchdog – 3.1. Operación – 3.1.2. Contador – a) Funcionamiento

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.107
3. Watchdog – 3.1. Operación – 3.1.2. Contador – a) Funcionamiento

─ La señal de reloj que controla el registro WDTCNT se selecciona mediante el


bit WDTSSEL del registro de control WDTCTL:
• WDTSSEL = 0: señal de reloj SMCLK
• WDTSSEL = 1: señal de reloj ACLK

─ Adicionalmente, existe un módulo de seguridad para detectar fallos en las


señal de reloj seleccionada para controlar el contador (SMCLK o ACLK)
durante la operación en el modo Watchdog, que se encarga de conmutar
automáticamente a MCLK cuando falla dicha señal

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.108
3. Watchdog – 3.1. Operación – 3.1.2. Contador – a) Funcionamiento

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.109
3. Watchdog – 3.1. Operación – 3.1.2. Contador – b) Tiempo de expiración

b) Tiempo de expiración
─ Los bits WDTIS0 y WDTIS1 del registro de control WDTCTL establecen el
número de ciclos a contar de la señal de reloj seleccionada, y con ello el tiempo
de expiración del Watchdog:
• WDTISx = 00  32768 ciclos
• WDTISx = 01  8192 ciclos
• WDTISx = 10  512 ciclos
• WDTISx = 11  64 ciclos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.110
3. Watchdog – 3.1. Operación – 3.1.2. Contador – b) Tiempo de expiración

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.111
3. Watchdog – 3.1. Operación – 3.1.2. Contador – b) Inicialización

c) Inicialización
─ El bit WDTCNTCL(1) del registro de control WDTCTL inicializa la cuenta del
registro WDTCNT a 0x0000

─ En el modo Watchdog hay que inicializar continuamente la cuenta del registro


WDTCNT a 0x0000 antes de que expire el tiempo programado

(1) El bit WDTCNTCL se pone automáticamente a ‘0’ tras inicializar el contador


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.112
3. Watchdog – 3.1. Operación – 3.1.2. Contador – b) Inicialización

─ Diagrama de bloques:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.113
3. Watchdog – 3.1. Operación – 3.1.3. Interrupciones

3.1.3. Interrupciones
─ El Watchdog dispone de dos interrupciones distintas, según el modo de
operación en el que se encuentre:
• Watchdog: interrupción con múltiples fuentes(1):
- Reset (WDTIFG): cuando se cuenta el número de ciclos programados
• Timer: interrupción con una única fuente(2):
- Cuenta (WDTIFG): cuando se cuenta el número de ciclos programados

(1) Al tener múltiples fuentes el flag de interrupción asociado a la fuente que ha originado la interrupción se debe inicializar a
‘0’ manualmente
(2) Al tener una única fuente el flag de interrupción asociado a la misma se inicializa a ‘0’ automáticamente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.114
3. Watchdog – 3.1. Operación – 3.1.3. Interrupciones

Interrupción
modo Watchdog

Interrupción
modo Timer

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.115
3. Watchdog – 3.1. Operación – 3.1.3. Interrupciones – a) Habilitación de interrupciones

a) Habilitación de interrupciones
─ Las distintas interrupciones del Watchdog se pueden habilitar mediante:
• Reset: esta interrupción no se puede deshabilitar, por lo que no dispone de
ningún bit de habilitación
• Cuenta: la interrupción que indica que se ha contado el número de ciclos
programados (WDTIFG) se habilita mediante el bit WDTIE del registro IE1

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.116
3. Watchdog – 3.1. Operación – 3.1.3. Interrupciones – b) Flags de interrupción

b) Flags de interrupción
─ Las distintas interrupciones del Watchdog comparten el mismo flag de
interrupción(1), el cual se encuentra en el siguiente registro:
• Reset/Cuenta: el flag WDTIFG que indica que se ha contado el número de
ciclos programados se encuentra en el registro IFG1

(1) Aunque ambas interrupciones comparten el mismo flag de interrupción, en función del modo de operación se generará
una u otra
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.117
3. Watchdog – 3.2. Configuración

3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.118
3. Watchdog – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.119
3. Watchdog – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.120
3. Watchdog – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.121
Índice

3.1.3. Interrupciones
a) Habilitación de interrupciones
b) Flags de interrupción

3.2. Configuración
4. Ejemplos
4.1. Antirrebote
4.2. Medición
4.3. Eventos
4.4. PWM

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.122
4. Ejemplos

4. Ejemplos
─ Temporización: entre las aplicaciones más comunes que se suelen utilizar con
los Temporizadores se encuentran :
• Antirrebote: eliminar las fluctuaciones de los pulsadores
• Medición: cálculo del tiempo transcurrido entre la ocurrencia de eventos
consecutivos
• Eventos: cómputo del número de eventos detectados
• PWM: generación de señales PWM para el control de dispositivos
electrónicos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.123
4. Ejemplos – 4.1. Antirrebote

4.1. Antirrebote Modo comparación

P1IFG_bit.P0  1 P1IFG_bit.P0  1

Rebotes Rebotes

Timer Timer

P1IFG_bit.P0 = 0; P1IFG_bit.P0 = 0; P1IFG_bit.P0 = 0; P1IFG_bit.P0 = 0;


P1IE_bit.P0 = 0; P1IES_bit.P0 = 0; P1IE_bit.P0 = 0; P1IES_bit.P0 = 1;
P1IE_bit.P0 = 1; P1IE_bit.P0 = 1;

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.124
4. Ejemplos – 4.2. Multifunción

4.2. Medición Modo captura

T = (TACCR0b – TACCR0a) + <num_TAIFG> * 0x10000


T
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.125
4. Ejemplos – 4.3. Eventos

4.3. Eventos Modo captura

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.126
4. Ejemplos – 4.4. PWM

4.4. PWM Unidad de salida

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T6.127
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Ejercicios Tema 6:
Temporizadores

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.0
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.1
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.2
1. Enunciados – Ejercicio 1

Ejercicio 1:
─ Calcular el máximo intervalo de tiempo que es posible medir con el Timer TA0
del microcontrolador MSP430G2533, indicando el valor de los registros de
configuración del microcontrolador y/o de los periféricos necesarios para obtener
dicho intervalo de tiempo, en los siguientes casos:
a) Utilizando en el sistema la frecuencia calibrada de 1 MHz como fuente de
reloj del DCO
b) Utilizando en el sistema un cristal de cuarzo externo de 32768 Hz

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.3
1. Enunciados – Ejercicio 2

Ejercicio 2:
─ Utilizando la frecuencia calibrada de 1 MHz como señal de reloj del Timer TA0
del microcontrolador MSP430G2533 se desean generar interrupciones
periódicas cada 13 ms, 29 ms y 41 ms:
a) Indicar el valor de los registros de configuración del Timer TA0 para
obtener dicha funcionalidad
b) Calcular los primeros 5 valores que es necesario introducir en los registros
TA0CCRx para obtener dicha funcionalidad (suponer que: TA0R = 0)
c) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
obtener dicha funcionalidad

NOTA: No se debe utilizar la división de la señal del reloj mediante el divisor del contador: IDx = 00
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.4
1. Enunciados – Ejercicio 3

Ejercicio 3:
─ Utilizando la frecuencia calibrada de 1 MHz como señal de reloj del Timer TA0
del microcontrolador MSP430G2533 se obtienen los siguientes valores en el
registro TA0CCR1 utilizando el proceso de captura en el modo ascendente:
TAR

TA0CCR0 = 0xC34F

t3 = 0x927C
t1 = 0x30D4

t4 = 0x30D4
t2 = 0x61A8

TA0CCR1 CCIFG t

TA0 TAIFG t

NOTA: No se debe utilizar la división de la señal del reloj mediante el divisor del contador: IDx = 00
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.5
1. Enunciados – Ejercicio 3

a) Determinar el intervalo de tiempo transcurrido entre cada par de eventos


consecutivos
b) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
poder calcular los milisegundos transcurridos entre cada par de eventos
consecutivos

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.6
1. Enunciados – Ejercicio 4

Ejercicio 4:
─ Utilizando la frecuencia calibrada de 1 MHz como señal de reloj de los Timers
del microcontrolador MSP430G2533 se desea obtener un PWM de frecuencia 20
Hz y ciclo de trabajo 25 % para hacer parpadear el LED2 de la placa LaunchPad:
a) Indicar el Timer TAx y la unidad de salida OUTx que se deben utilizar
b) Indicar los modos de operación del contador TAR válidos para implementar
el PWM, especificando para cada uno de ellos el valor del registro
TAxCCR0 si fuese necesario
c) Para cada modo de operación del contador TAR válido, indicar los modos
de salida de la unidad de salida OUTx válidos para implementar el PWM,
especificando para cada uno de ellos el valor del temporizador TACCRx si
fuese necesario

NOTA: No se debe utilizar la división de la señal del reloj mediante el divisor del contador: IDx = 00
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.7
1. Enunciados – Ejercicio 5

Ejercicio 5:
─ En el fichero de cabecera “io430g2533.h” aparecen las siguientes definiciones
relacionadas con el Watchdog:
#define WDTPW (0x5A00u)

/* WDT is clocked by fSMCLK (assumed 1MHz) */


#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

/* WDT is clocked by fACLK (assumed 32KHz) */


#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */

/* WDT is clocked by fSMCLK (assumed 1MHz) */


#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

/* WDT is clocked by fACLK (assumed 32KHz) */


#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.8
1. Enunciados – Ejercicio 5

a) Indicar la función de cada una de las etiquetas de configuración del


Watchdog según el nombre de la misma

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.9
Índice

1. Enunciados
2. Solución

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.10
2. Solución – Ejercicio 1

Ejercicio 1:
a) Utilizando en el sistema la frecuencia calibrada de 1 MHz como fuente de
reloj del DCO
b) Utilizando en el sistema un cristal de cuarzo externo de 32768 Hz

DCOCTL = CALDCO_1MHz
DCOCLK 1 MHz
BCSCTL1 = CALBC1_1MHz
SMCLK 125 KHz
BCSCTL2 = DIVS_3

TA0CTL = TASSEL_2 + ID_3 + MC_3 TA0 Clock f = 15.625 KHz  T = 64 μs


TA0CCR0 = 0xFFFF Cuenta Máx. 0x1FFFE ciclos ≈ 8.4 s

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.11
2. Solución – Ejercicio 1

a) Utilizando en el sistema la frecuencia calibrada de 1 MHz como fuente de


reloj del DCO
b) Utilizando en el sistema un cristal de cuarzo externo de 32768 Hz

BCSCTL1 |= DIVA_3 ACLK 4.096 KHz

TA0CTL = TASSEL_1 + ID_3 + MC_3 TA0 Clock f = 512 Hz  T = 1.953 ms


TA0CCR0 = 0xFFFF Cuenta Máx. 0x1FFFE ciclos ≈ 4.3 min

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.12
2. Solución – Ejercicio 2

Ejercicio 2:
a) Indicar el valor de los registros de configuración del Timer TA0 para
obtener dicha funcionalidad
b) Calcular los primeros 5 valores que es necesario introducir en los registros
TA0CCRx para obtener dicha funcionalidad (suponer que: TA0R = 0)
c) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
obtener dicha funcionalidad
TA0CTL = TASSEL_2 + MC_2
TA0CCR0 = TA0R + 0x32C8
TA0CCTL0 = CCIE
TA0CCR1 = TA0R + 0x7148
TA0CCTL1 = CCIE
TA0CCR2 = TA0R + 0xA028
TA0CCTL2 = CCIE

NOTA: No se debe utilizar la división de la señal del reloj mediante el divisor del contador: IDx = 00
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.13
2. Solución – Ejercicio 2

a) Indicar el valor de los registros de configuración del Timer TA0 para


obtener dicha funcionalidad
b) Calcular los primeros 5 valores que es necesario introducir en los registros
TA0CCRx para obtener dicha funcionalidad (suponer que: TA0R = 0)
c) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
obtener dicha funcionalidad
TA0CCR0 = 0x32C8  0x6590 – 0x9858 – 0xCB20 – 0xFDE8
TA0CCR1 = 0x7148  0xE290 – 0x53D8 – 0xC520 – 0x3668
TA0CCR2 = 0xA028  0x4050 – 0xE078 – 0x80A0 – 0x20C8

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.14
2. Solución – Ejercicio 2

a) Indicar el valor de los registros de configuración del Timer TA0 para


obtener dicha funcionalidad
b) Calcular los primeros 5 valores que es necesario introducir en los registros
TA0CCRx para obtener dicha funcionalidad (suponer que: TA0R = 0)
c) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
obtener dicha funcionalidad
#pragma vector = TIMER0_A0_VECTOR
__interrupt void RTI_TA0_CCR0(void) {
TA0CCR0 += 0x32C8;
...
} // void RTI_TA0_CCR0(void)

#pragma vector = TIMER0_A1_VECTOR


__interrupt void RTI_TA0_CCR12(void) {
switch (__even_in_range(TAIV, 10)) {
case 2: {
TA0CCR1 += 0x7148;
break;
} // case 2
case 4: {
TA0CCR2 += 0xA028;
break;
} // case 4
} // switch (__even_in_range(TAIV, 10))
...
} // void RTI_TA0_CCR12(void)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.15
2. Solución – Ejercicio 3

Ejercicio 3:
a) Determinar el intervalo de tiempo transcurrido entre cada par de eventos
consecutivos
b) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
poder calcular los milisegundos transcurridos entre cada par de eventos
consecutivos
T i-1,i = (TA0CCR1 i  TA0CCR1 i-1) + <num_TAIFG> * 0xC350

T 1,2 = 0x030D4 ciclos = 12.5 ms


T 2,3 = 0x0F424 ciclos = 62.5 ms
T 3,4 = 0x124F8 ciclos = 75.0 ms

NOTA: No se debe utilizar la división de la señal del reloj mediante el divisor del contador: IDx = 00
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.16
2. Solución – Ejercicio 3

a) Determinar el intervalo de tiempo transcurrido entre cada par de eventos


consecutivos
b) Desarrollar el código de las rutinas de interrupción del Timer TA0 para
poder calcular los milisegundos transcurridos entre cada par de eventos
consecutivos
float num_ms;
unsigned int num_50ms = 0;
...
#pragma vector = TIMER0_A1_VECTOR
__interrupt void RTI_TA0_CCR1_TAIFG(void) {
static unsigned int TA0CCR1_ant = 0;
switch (__even_in_range(TAIV, 10)) {
case 2: {
num_ms = ((float) (TA0CCR1 – TA0CCR1_ant)/1000.0) + num_50ms * 50;
TA0CCR1_ant = TA0CCR1;
num_50ms = 0;
} // case 2
case 10: {
num_50ms++;
break;
} // case 10
} // switch (__even_in_range(TAIV, 10))
} // void RTI_TA0_TAIFG(void)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.17
2. Solución – Ejercicio 4

Ejercicio 4:
a) Indicar el Timer TAx y la unidad de salida OUTx que se deben utilizar
b) Indicar los modos de operación del contador TAR válidos para implementar
el PWM, especificando para cada uno de ellos el valor del registro
TAxCCR0 si fuese necesario
c) Para cada modo de operación del contador TAR válido, indicar los modos
de salida de la unidad de salida OUTx válidos para implementar el PWM,
especificando para cada uno de ellos el valor del temporizador TACCRx si
fuese necesario

TA0.1 = TA0 + OUT1

NOTA: No se debe utilizar la división de la señal del reloj mediante el divisor del contador: IDx = 00
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.18
2. Solución – Ejercicio 4

a) Indicar el Timer TAx y la unidad de salida OUTx que se deben utilizar


b) Indicar los modos de operación del contador TAR válidos para implementar
el PWM, especificando para cada uno de ellos el valor del registro
TAxCCR0 si fuese necesario
c) Para cada modo de operación del contador TAR válido, indicar los modos
de salida de la unidad de salida OUTx válidos para implementar el PWM,
especificando para cada uno de ellos el valor del temporizador TACCRx si
fuese necesario
Modo ascendente: VÁLIDO  TA0CCR0 = 0xC34F
Modo continuo: NO VÁLIDO  f ≈ 15.3 Hz ≠ 20 Hz
Modo ascendente/descendente: VÁLIDO  TA0CCR0 = 0x61A8

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.19
2. Solución – Ejercicio 4

a) Indicar el Timer TAx y la unidad de salida OUTx que se deben utilizar


b) Indicar los modos de operación del contador TAR válidos para implementar
el PWM, especificando para cada uno de ellos el valor del registro
TAxCCR0 si fuese necesario
c) Para cada modo de operación del contador TAR válido, indicar los modos
de salida de la unidad de salida OUTx válidos para implementar el PWM,
especificando para cada uno de ellos el valor del temporizador TACCRx si
fuese necesario
Modo ascendente: Modo ascendente/descendente:
Modo 2 (Toggle/Reset): TA0CCR1 = 0x927C Modo 2 (Toggle/Reset): TA0CCR1 = 0x186A
Modo 3 (Set/Reset) : TA0CCR1 = 0x927C Modo 3 (Set/Reset)(1) : NO VÁLIDO
Modo 6 (Toggle/Set) : TA0CCR1 = 0x30D4 Modo 6 (Toggle/Set) : TA0CCR1 = 0x493E
Modo 7 (Reset/Set) : TA0CCR1 = 0x30D4 Modo 7 (Reset/Set)(2) : TA0CCR1 = 0x30D4

(1) Sólo para ciclos de trabajo ≥ 50 %


(2) Sólo para ciclos de trabajo ≤ 50 %
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.20
2. Solución – Ejercicio 5

Ejercicio 5:
a) Indicar la función de cada una de las etiquetas de configuración del
Watchdog según el nombre de la misma
WDT_<C><MOD>_<TIME>

<C>  Señal de reloj: <MOD>  Modo: <TIME>  Tiempo:


M = SMCLK (1 MHz) DLY = Temporizador (1 MHz) 32 = 32 ms
A = ACLK (32 KHz) RST = Watchdog 8 = 8 ms
0_5 = 0.5 ms
0_064 = 0.064 ms
(32 KHz)1000 = 1000 ms
250 = 250 ms
16 = 16 ms
1_9 = 1.9 ms

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 ET6.21
Universidad de Málaga
Departamento de Tecnología Electrónica

Grado en Ingeniería de Sistemas Electrónicos


Grado en Ingeniería Telemática

Microcontroladores

Tema 7:
Comunicaciones

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.0
Índice

3.1.5. Configuración
1. Introducción
3.1.6. Interrupciones
2. Interfaces a) Habilitación de interrupciones
b) Flags de interrupción
2.1. Serie c) Atención de interrupciones
2.1.1. UART 3.2. Configuración
a) Características
b) Formato
c) Tasa de transmisión
2.1.2. RS232
2.1.3. Dispositivos virtuales
3. USCI: UART
3.1. Operación
3.1.1. Generador de baudios
a) Tasa de transmisión
b) Operación en bajo consumo
3.1.2. Transmisor
a) Funcionamiento
b) Activación y desactivación
3.1.3. Receptor
a) Funcionamiento
b) Activación y desactivación
3.1.4. Inicialización
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.1
Índice

3.1.5. Configuración
1. Introducción
3.1.6. Interrupciones
2. Interfaces a) Habilitación de interrupciones
b) Flags de interrupción
2.1. Serie c) Atención de interrupciones
2.1.1. UART 3.2. Configuración
a) Características
b) Formato
c) Tasa de transmisión
2.1.2. RS232
2.1.3. Dispositivos virtuales
3. USCI: UART
3.1. Operación
3.1.1. Generador de baudios
a) Tasa de transmisión
b) Operación en bajo consumo
3.1.2. Transmisor
a) Funcionamiento
b) Activación y desactivación
3.1.3. Receptor
a) Funcionamiento
b) Activación y desactivación
3.1.4. Inicialización
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.2
1. Introducción

1. Introducción
MSP430G2533 (encapsulado de 20 pines):

USCI

NOTA: En la placa LaunchPad se utiliza el encapsulado de 20 pines


Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.3
1. Introducción

─ Funcionalidad: el módulo de comunicaciones USCI (“Universal Serial


Communication Interface”) implementa distintos protocolos de comunicaciones
serie, entre los cuales se destacan:
• UART: (“Universal Asynchronous Receiver/Transceiver”)
- Comunicación serie asíncrona dúplex (full duplex)
• SPI: (“Synchronous Peripheral Interface”)
- Comunicación serie síncrona dúplex (full duplex)
• I2C: (“Inter-Integrated Circuit”)
- Comunicación serie síncrona semidúplex (half duplex)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.4
1. Introducción

─ Funcionalidad: el módulo de comunicaciones USCI (“Universal Serial


Communication Interface”) implementa distintos protocolos de comunicaciones
serie, entre los cuales se destacan:
• UART: (“Universal Asynchronous Receiver/Transceiver”)
- Comunicación serie asíncrona dúplex (full duplex)
• SPI: (“Synchronous Peripheral Interface”)
- Comunicación serie síncrona dúplex (full duplex)
• I2C: (“Inter-Integrated Circuit”)
- Comunicación serie síncrona semidúplex (half duplex)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.5
1. Introducción

─ Funcionalidad: el módulo de comunicaciones USCI (“Universal Serial


Communication Interface”) implementa distintos protocolos de comunicaciones
serie, entre los cuales se destacan:
• UART: (“Universal Asynchronous Receiver/Transceiver”)
- Comunicación serie asíncrona dúplex (full duplex)
• SPI: (“Synchronous Peripheral Interface”)
- Comunicación serie síncrona dúplex (full duplex)
• I2C: (“Inter-Integrated Circuit”)
- Comunicación serie síncrona semidúplex (half duplex)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.6
Índice

3.1.5. Configuración
1. Introducción
3.1.6. Interrupciones
2. Interfaces a) Habilitación de interrupciones
b) Flags de interrupción
2.1. Serie c) Atención de interrupciones
2.1.1. UART 3.2. Configuración
a) Características
b) Formato
c) Tasa de transmisión
2.1.2. RS232
2.1.3. Dispositivos virtuales
3. USCI: UART
3.1. Operación
3.1.1. Generador de baudios
a) Tasa de transmisión
b) Operación en bajo consumo
3.1.2. Transmisor
a) Funcionamiento
b) Activación y desactivación
3.1.3. Receptor
a) Funcionamiento
b) Activación y desactivación
3.1.4. Inicialización
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.7
2. Interfaces

2. Interfaces
─ Paralelo: los bits que forman los datos se transmiten simultáneamente por
distintas líneas: D0

 Mayor velocidad de transmisión D1


D2
 Mayor coste (varios pines/líneas de datos) D3
D4
D5
D6
D7

─ Serie: los bits que forman los datos se transmiten secuencialmente por la misma
línea:
 Menor coste (un único pin/línea de datos)
 Menor velocidad de transmisión

D7 D6 D5 D4 D3 D2 D1 D0

NOTA: Siempre es necesario interconectar la señal de tierra de los sistemas que se comunican mediante otra línea
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.8
2. Interfaces – 2.1. Serie

2.1. Serie
─ Síncrona: el intercambio de datos entre distintos sistemas está controlado por
una misma señal de reloj, la cual es enviada por el transmisor (maestro) hasta el
receptor (esclavo) por otra línea distinta de la de datos:
 Mayor velocidad de transmisión (menor error de sincronización)
 Mayor coste (una línea adicional para la señal de reloj)

D7 D6 D5 D4 D3 D2 D1 D0

─ Asíncrona: el intercambio de datos entre distintos sistemas está controlado por


la temporización de la propia señal de datos:
 Menor coste (ninguna línea adicional)
 Menor velocidad de transmisión (mayor error de sincronización)

D7 D6 D5 D4 D3 D2 D1 D0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.9
2. Interfaces – 2.1. Serie

─ Símplex: el intercambio de datos se produce en un único sentido


(unidireccional), por lo que únicamente se necesita una línea de datos:
D7 D6 D5 D4 D3 D2 D1 D0

─ Semidúplex: el intercambio de datos se produce en ambos sentidos


(bidireccional) pero no simultáneamente, por lo que únicamente se necesita una
línea de datos:
D7 D6 D5 D4 D3 D2 D1 D0

─ Dúplex: el intercambio de datos se produce en ambos sentidos (bidireccional) y


simultáneamente, por lo que se necesita una línea de datos adicional:

D0 D1 D2 D3 D4 D5 D6 D7
D7 D6 D5 D4 D3 D2 D1 D0

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.10
2. Interfaces – 2.1. Serie – 2.1.1. UART

2.1.1. UART
─ La comunicación serie asíncrona dúplex es una de las más utilizadas por su
sencillez de implementación, a pesar de no permitir velocidades de transmisión
muy elevadas
─ Esta sencillez de implementación ha derivado en que prácticamente cualquier
microcontrolador disponga de un módulo de comunicaciones específico para
gestionar dicha comunicación
─ Tradicionalmente el dispositivo hardware que implementaba este interfaz de
comunicación se conocía como UART (“Universal Asynchronous
Receiver/Transceiver”)

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.11
2. Interfaces – 2.1. Serie – 2.1.1. UART – a) Características

a) Características
─ Los datos se transmiten carácter a carácter
─ Los caracteres se transmiten individualmente
─ El tiempo de separación entre caracteres consecutivos no se conoce
(comunicación asíncrona)
─ Los bits de un carácter se transmiten consecutivamente sin separación
temporal entre ellos
─ Cuando no se transmiten datos la línea de datos permanece en su estado de
reposo, que se corresponde con un “1” lógico
─ Al “1” lógico se le conoce como mark
─ Al “0” lógico se le conoce como space
─ La comunicación sólo es posible si transmisor y receptor utilizan internamente
la misma frecuencia de la señal de reloj
─ Cada carácter se transmite con un formato predefinido

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.12
2. Interfaces – 2.1. Serie – 2.1.1. UART – b) Formato

b) Formato
─ El formato utilizado en la transmisión de cada carácter es el siguiente:
• Bit de arranque: se representa como ST y se corresponde con un “0”
lógico. Se utiliza para que el receptor inicialice su señal de reloj interna, de
forma que esté sincronizada con la del transmisor
• Bits de datos: se corresponden con 7 u 8 bits de datos, donde normalmente
se transmite primero el bit menos significativo
• Bit de paridad (opcional): se representa como PA, y se utiliza como un
mecanismo simple de detección de errores
• Bit(s) de parada: uno o dos bits que se representan como SP y se
corresponden con un “1” lógico. Se utilizan para separar los distintos
caracteres transmitidos, pues el siguiente carácter comenzará con un bit de
arranque que se corresponde con un “0” lógico. Así pues, siempre se
asegura una transición “1  0” entre un carácter y el siguiente

CARÁCTER ST D0 D1 D2 D3 D4 D5 D6 D7 PA SP

RELOJ

Sincronización Muestreo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.13
2. Interfaces – 2.1. Serie – 2.1.1. UART – b) Formato

─ El mecanismo de paridad permite implementar un mecanismo simple de


detección de errores, aunque no posibilita su corrección
─ Si se selecciona la utilización del mecanismo de paridad, se pueden escoger
dos opciones para generar el bit de paridad PA:
• Par: el bit PA se utiliza para forzar un número par de bits al valor “1” lógico
(excluyendo los bits de arranque y de parada). Así pues, el bit PA se activará
cuando en los bits de datos haya un número impar de valores a “1” lógico

CARÁCTER ST 0 1 0 1 0 1 0 1 0 SP

CARÁCTER ST 0 0 0 1 0 1 0 1 1 SP

• Impar: el bit PA se utiliza para forzar un número impar de bits al valor “1”
lógico (excluyendo los bits de arranque y de parada). Así pues, el bit PA se
activará cuando en los bits de datos haya un número par de valores a “1”
lógico

CARÁCTER ST 0 0 0 1 0 1 0 1 0 SP

CARÁCTER ST 0 1 0 1 0 1 0 1 1 SP

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.14
2. Interfaces – 2.1. Serie – 2.1.1. UART – c) Tasa de transmisión

c) Tasa de transmisión
─ La tasa de transmisión se mide en baudios, que representa el número de bits
por segundo que se transmiten en la línea de datos
─ Es importante diferenciar la tasa de transmisión de la tasa de datos, la cual
representa el número de bits de datos por segundo que se transmiten en la
línea de datos
─ Puesto que cada carácter contiene como mínimo un bit de arranque más un bit
de parada, la tasa de datos puede alcanzar como máximo el 80% de la tasa de
transmisión
─ Existen unos valores estándar de tasas de transmisión que la mayoría de las
UARTs implementan: 1200, 2400, 4800, 9600, 19200,115200... baudios
─ Tanto el transmisor como el receptor deben utilizar la misma tasa de
transmisión y garantizar que se mantiene lo más estable posible durante la
transmisión(1)

(1) Un error de un 5% entre las frecuencias de las señales de reloj del transmisor y del receptor puede suponer que no se
pueda realizar la comunicación correctamente
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.15
2. Interfaces – 2.1. Serie – 2.1.2. RS232

2.1.2. RS232
─ Para conectar físicamente distintos sistemas mediante el interfaz serie
asíncrono es necesario garantizar:
• Protocolo: el formato de los caracteres transmitidos debe ser el mismo
tanto en el transmisor como en el receptor
• Características eléctricas: el nivel de tensión de las señales transmitidas
debe adecuarse a un rango de valores determinado
• Características físicas: los conectores a utilizar en ambos sistemas deben
estar definidos, especificando las señales que se transmiten en cada pin del
conector
─ El estándar RS232 es uno de los más utilizados para permitir la comunicación
entre sistemas mediante el interfaz serie asíncrono. Este estándar define:
• Protocolo: utiliza el formato de comunicación empleado por la UART
• Características eléctricas: especifica el “1” lógico en el rango de tensiones
(-24, -3) V, y el “0” lógico en el rango de tensiones (+3, +24) V(1)
• Características físicas: define varios tipos de conectores, siendo el más
utilizado el DB9
(1) El estándar RS232 recomienda que se utilicen los valores de tensión -12 V para el “1” lógico y +12 V para el “0” lógico
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.16
2. Interfaces – 2.1. Serie – 2.1.2. RS232

─ El cumplimiento de las características eléctricas del estándar RS232 supone


un serio problema en los sistemas basados en microcontroladores, no sólo por
los elevados niveles de tensión recomendados(1), sino también porque es
necesaria la generación de señales de tensión negativa
─ Para posibilitar la utilización del estándar RS232 en los sistemas basados en
microcontroladores existen circuitos integrados específicos que actúan como
drivers, generando los niveles de tensión necesarios en el estándar RS232 a
partir de tensiones de operación positivas(2). Los más utilizados son el MAX232
(interfaz entre 5 V y RS232) y el MAX3232 (interfaz entre 3 V y RS232)

(1) Cuanto mayores sean los niveles de tensión implementados más alejados estarán a nivel eléctrico el “1” lógico y el “0”
lógico, por lo que la comunicación será menos sensible a interferencias y se podrán comunicar sistemas a mayores
tasas de transmisión o a mayores distancias
(2) Estos circuitos requieren la conexión de varios condensadores externos, los cuales se utilizan como dispositivos de
almacenamiento de carga que utilizados convenientemente pueden generar tensiones negativas a partir de tensiones de
alimentación positivas
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.17
2. Interfaces – 2.1. Serie – 2.1.2. RS232

─ El conector DB9 es el más utilizado en el estándar RS232, el cual dispone de 9


pines capaces de transmitir 9 señales(1)

Línea de recepción de datos


Dúplex
Línea de transmisión de datos

─ Para permitir la interconexión de sistemas existen dos tipos de conectores DB9:


macho y hembra. Ambos tienen el patillaje invertido, de forma que al
conectarlos las líneas de señal se acoplan correctamente

Macho Hembra

(1) El conector DB9 surgió para permitir la interconexión de módems con ordenadores, lo que normalmente requería la
utilización de numerosas señales de control para entre ambos sistemas para garantizar la trasmisión de datos.
Actualmente sólo se suelen utilizar las señales de transmisión (TD – pin 3), recepción (RD – pin 2) y tierra (GND – pin 5)
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.18
2. Interfaces – 2.1. Serie – 2.1.2. RS232

─ Utilizando los conectores DB9 existentes se pueden implementar dos tipos


distintos de cables para la interconexión de sistemas(1):
• Directo: conecta las señales de transmisión de ambos sistemas entre sí y
las señales de recepción de ambos sistemas entre sí:

A utilizar cuando un sistema tiene la señal de


transmisión en el pin 3 y la señal de recepción en el pin
2, mientras que el otro sistema tiene la señal de
transmisión en el pin 2 y la señal de recepción en el pin
3 (por ejemplo, un PC y un microcontrolador)

• Cruzado (null modem): conecta las señales de transmisión de un sistema


con las señales de recepción del otro sistema y viceversa

A utilizar cuando ambos sistemas tienen la señal de


transmisión en el pin 3 y la señal de recepción en el pin
2 (por ejemplo, dos PCs)

(1) El tipo de cable implementado (directo o cruzado) es independiente del tipo de conector DB9 (macho o hembra) utilizado
en cada extremo, por lo que existen múltiples cables combinando ambos elementos
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.19
2. Interfaces – 2.1. Serie – 2.1.3. Dispositivos virtuales

2.1.3. Dispositivos virtuales


─ Actualmente el estándar RS232 está siendo desplazado por otro tipo de
interfaces de comunicación serie, como puede ser el USB (“Universal Serial
Bus”)
─ No obstante, debido a su sencillez de implementación, muchos dispositivos
siguen utilizando el interfaz de comunicaciones serie asíncrono (UART)
─ Este hecho ha propiciado que se implementen circuitos específicos de
adaptación entre los interfaces UART y USB, de forma que mediante el interfaz
USB se implementa un dispositivo virtual (no existente físicamente) que tiene
la misma funcionalidad que la UART

UART

USB

Adaptador UART-USB

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.20
Índice

3.1.5. Configuración
1. Introducción
3.1.6. Interrupciones
2. Interfaces a) Habilitación de interrupciones
b) Flags de interrupción
2.1. Serie c) Atención de interrupciones
2.1.1. UART 3.2. Configuración
a) Características
b) Formato
c) Tasa de transmisión
2.1.2. RS232
2.1.3. Dispositivos virtuales
3. USCI: UART
3.1. Operación
3.1.1. Generador de baudios
a) Tasa de transmisión
b) Operación en bajo consumo
3.1.2. Transmisor
a) Funcionamiento
b) Activación y desactivación
3.1.3. Receptor
a) Funcionamiento
b) Activación y desactivación
3.1.4. Inicialización
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.21
3. USCI: UART

3. USCI: UART
─ Existe 1 USCI en el MSP430G2533 (USCI0), la cual posee dos canales de
comunicación (A y B):
• Canal A: implementa los interfaces UART y SPI
• Canal B: implementa los interfaces SPI e I2C

USCI 0
Canal A

USCI 0
Canal B

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.22
3. USCI: UART – 3.1. Operación

3.1. Operación
─ La USCI está compuesta por los siguientes elementos básicos:
• Generador de baudios: genera la señal de reloj del sistema necesaria para
llevar a cabo la comunicación
• Transmisor: genera la señal de datos a transmitir a partir del dato
• Receptor: recupera el dato transmitido a partir de la señal de datos recibida

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.23
3. USCI: UART – 3.1. Operación

─ Diagrama de bloques:

Receptor

Generador de baudios

Transmisor

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.24
3. USCI: UART – 3.1. Operación – 3.1.1. Generador de baudios

3.1.1. Generador de baudios


─ Para describir la operación del generador de baudios es necesario considerar
los siguientes aspectos:
• Tasa de transmisión: establecimiento de la tasa de transmisión utilizada
durante la comunicación
• Operación en bajo consumo: funcionamiento en los modos de bajo
consumo

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.25
3. USCI: UART – 3.1. Operación – 3.1.1. Generador de baudios – a) Tasa de transmisión

a) Tasa de transmisión
─ La señal de reloj que controla el generador de baudios se selecciona mediante
los bits UCSSELx del registro UCA0CTL1:

─ A partir de la señal de reloj que controla el generador de baudios se debe


generar la señal de reloj que controla la transmisión (baudios). Este proceso es
bastante complejo, pues las tasas de transmisión estándar (1200, 2400, 4800,
9600, 19200,115200... baudios) no suelen ser un submúltiplo de la señal de reloj
que controla el generador de baudios, por lo que no se pueden generar
directamente con un divisor
─ Para resolver este inconveniente el generador de baudios cuenta con un
preescalador y un modulador, circuitos que tratan de generar con la mayor
precisión posible señales de reloj relacionadas entre sí por valores que no son
enteros

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.26
3. USCI: UART – 3.1. Operación – 3.1.1. Generador de baudios – a) Tasa de transmisión

─ La tasa de transmisión se selecciona mediante los registros UCA0BR0,


UCA0BR1 y UCA0MCTL:

─ Los valores a introducir en los campos de estos registros se pueden obtener


mediante ecuaciones matemáticas, o mediante tablas donde se describen estos
valores para las tasas de transmisión estándar

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.27
3. USCI: UART – 3.1. Operación – 3.1.1. Generador de baudios – a) Tasa de transmisión

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.28
3. USCI: UART – 3.1. Operación – 3.1.1. Generador de baudios – b) Operación en bajo consumo

b) Operación en bajo consumo


─ Cuando se selecciona la señal de reloj SMCLK para controlar el generador de
baudios y se activa un modo de bajo consumo, la USCI activa
automáticamente la señal de reloj SMCLK cuando recibe algún dato,
independientemente del modo de bajo consumo utilizado(1)
─ Una vez finalizada la recepción, la señal de reloj SMCLK vuelve a
desactivarse según el modo de bajo consumo utilizado

MUY IMPORTANTE

(1) Al activarse la señal de reloj SMCLK también se activan todos los periféricos que utilizan dicha señal para su operación
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.29
3. USCI: UART – 3.1. Operación – 3.1.2. Transmisor

3.1.2. Transmisor
─ Para describir la operación del transmisor es necesario considerar los
siguientes aspectos:
• Funcionamiento: mecanismo de transmisión
• Activación y desactivación: puesta en marcha y detención

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.30
3. USCI: UART – 3.1. Operación – 3.1.2. Transmisor – a) Funcionamiento

a) Funcionamiento
─ La operación del transmisor se basa en la existencia de dos registros:
• Registro de transmisión (UCA0TXBUF): registro de almacenamiento con
carga en paralelo del dato a transmitir

• Registro serie: registro de desplazamiento serie que desplaza un bit del


dato almacenado en cada flanco de la señal de reloj

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.31
3. USCI: UART – 3.1. Operación – 3.1.2. Transmisor – a) Funcionamiento

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.32
3. USCI: UART – 3.1. Operación – 3.1.2. Transmisor – b) Activación y desactivación

b) Activación y desactivación
─ El transmisor está listo para transmitir cuando el registro de transmisión está
vacío
─ Cuando el transmisor está listo para transmitir se activa su operación
almacenando un dato en el registro de transmisión, momento en el que se
llevan a cabo las siguientes operaciones
• Activación del generador de baudios
• Transferencia del dato almacenado desde el registro de transmisión al
registro serie(1)
• Comienzo de la transferencia de datos
─ Cuando no existen más datos que transmitir (tanto el registro de transmisión
como el registro serie se encuentran vacíos) el transmisor se desactiva,
momento en el que se llevan a cabo las siguientes operaciones:
• Desactivación del generador de baudios

(1) Así pues, se puede almacenar otro dato a transmitir en el registro de transmisión aun cuando el registro serie está
ocupado transmitiendo un dato, de forma que al finalizar la transmisión del dato actual comenzará inmediatamente la
transmisión del nuevo dato
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.33
3. USCI: UART – 3.1. Operación – 3.1.3. Receptor

3.1.3. Receptor
─ Para describir la operación del receptor es necesario considerar los siguientes
aspectos:
• Funcionamiento: mecanismo de recepción
• Activación y desactivación: puesta en marcha y detención

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.34
3. USCI: UART – 3.1. Operación – 3.1.3. Receptor – a) Funcionamiento

a) Funcionamiento
─ La operación del receptor se basa en la existencia de dos registros:
• Registro serie: registro de desplazamiento serie que desplaza un bit el dato
recibido en cada flanco de la señal de reloj
• Registro de recepción (UCA0RXBUF): registro de almacenamiento con
carga en paralelo del dato recibido

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.35
3. USCI: UART – 3.1. Operación – 3.1.3. Receptor – a) Funcionamiento

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.36
3. USCI: UART – 3.1. Operación – 3.1.3. Receptor – b) Activación y desactivación

b) Activación y desactivación
─ El receptor está listo para recibir cuando el registro serie está vacío
─ Cuando el receptor está listo para recibir se activa su operación cuando se
detecta la presencia de un bit de arranque en la línea de datos, momento en el
que se llevan a cabo las siguientes operaciones
• Activación del generador de baudios
• Comienzo de la recepción de datos
• Transferencia del dato recibido desde el registro serie al registro de
recepción(1)
─ Cuando no existen más datos que recibir (no aparece otro bit de arranque en la
línea de datos) el reseptor se desactiva, momento en el que se llevan a cabo
las siguientes operaciones:
• Desactivación del generador de baudios

(1) Así pues, se puede recibir otro dato en el registro serie aun cuando el registro de recepción está ocupado con el último
dato recibido a la espera de ser leído
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.37
3. USCI: UART – 3.1. Operación – 3.1.4. Inicialización

3.1.4. Inicialización
─ La correcta inicialización de la USCI se realiza mediante el siguiente
procedimiento:
• Activar el bit UCSWRST del registro UCA0CTL1 para introducir a la USCI en
el modo reset (detenida)

• Configurar todos los registros de la USCI


• Desactivar el bit UCSWRST del registro UCA0CTL1 para sacar a la USCI
del modo reset (lista)
• Activar, si se necesitan, las interrupciones de la USCI

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.38
3. USCI: UART – 3.1. Operación – 3.1.5. Configuración

3.1.5. Configuración
─ La configuración del formato del carácter transmitido (número de bits de datos,
paridad, tipo de paridad, número de bits de parada...) se configura mediante los
campos del registro UCA0CTL0:

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.39
3. USCI: UART – 3.1. Operación – 3.1.6. Interrupciones

3.1.6. Interrupciones
─ La USCI dispone de dos interrupciones distintas:
• Transmisión: interrupción con múltiples fuentes(1):
- UCA0TX: se activa al encontrarse la USCI_A0 lista para iniciar una
nueva transmisión
• Recepción: interrupción con múltiples fuentes(1):
- UCA0RX: se activa al haber recibido un nuevo dato la USCI_A0

(1) Al tratarse de interrupciones con múltiples fuentes hay que limpiar el flag de cada interrupción manualmente en la Rutina
de Tratamiento de Interrupción
Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.40
3. USCI: UART – 3.1. Operación – 3.1.6. Interrupciones

Recepción
Transmisión

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.41
3. USCI: UART – 3.1. Operación – 3.1.6. Interrupciones – a) Habilitación de interrupciones

a) Habilitación de interrupciones
─ Las distintas interrupciones de la USCI se pueden habilitar mediante:
• Transmisión: la interrupción que indica que la USCI_A0 está lista para
transmitir un nuevo dato se habilita mediante el bit UCA0TXIE del registro
IE2
• Recepción: la interrupción que indica que la USCI_A0 ha recibido un nuevo
dato se habilita mediante el bit UCA0RXIE del registro IE2

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.42
3. USCI: UART – 3.1. Operación – 3.1.6. Interrupciones – b) Flags de interrupción

b) Flags de interrupción
─ Los flags de interrupción de la USCI se encuentran en los siguientes registros :
• Transmisión: el flag UCA0TXIFG del registro IFG2 indica que la USCI_A0
está lista para transmitir un nuevo dato
• Recepción: el flag UCA0RXIFG del registro IFG2 indica que la USCI_A0 ha
recibido un nuevo dato

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.43
3. USCI: UART – 3.1. Operación – 3.1.6. Interrupciones – c) Atención de interrupciones

c) Atención de interrupciones
─ La interrupción de transmisión UCA0TX limpia su flag automáticamente al
escribir en el registro de transmisión UCA0TXBUF
─ La interrupción de recepción UCA0RX limpia su flag automáticamente al leer el
registro de recepción UCA0RXBUF

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.44
3. USCI: UART – 3.2. Configuración

3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.45
3. USCI: UART – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.46
3. USCI: UART – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.47
3. USCI: UART – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.48
3. USCI: UART – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.49
3. USCI: UART – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.50
3. USCI: UART – 3.2. Configuración

Microcontroladores - Grado en Ingeniería de Sistemas Electrónicos - Grado en Ingeniería Telemática - Curso 2015/2016 T7.51
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 10 DE SEPTIEMBRE DE 2012
EXAMEN DE MICROCONTROLADORES TIEMPO: 3 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) RESPONDA JUSTIFICADAMENTE CADA PREGUNTA EN EL ESPACIO RESERVADO PARA ELLO (NO SE
CONSIDERARÁ VÁLIDA NINGUNA RESPUESTA NO JUSTIFICADA)
c) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
d) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA

DATOS:
a) CONSTANTES DEL FICHERO DE CABECERA “io430g2533.h”:
 #define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */
 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
 #define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */
 #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continuous up */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0_A CC1, CC2, TA0 */
 #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */
 #define TIMER1_A1_VECTOR (12 * 2u) /* 0xFFF8 Timer1_A CC1, CC2, TA1 */
 #define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA Timer1_A CC0 */

Se desea diseñar el sistema de control de un aparcamiento para vehículos basándonos en un sistema digital
desarrollado con el microcontrolador MSP430G2533.En la Figura 1 se muestra el esquema general del
aparcamiento, compuesto por dos pulsadores, dos barreras, dos sensores de infrarrojos y dos carteles
luminosos.

Figura 1. Esquema del aparcamiento.

-1/8-
En la Figura 2 se muestran detalladamente los distintos elementos del aparcamiento:

BxS
BxB

Sx

Px

CL LIBRE

CC COMPLETO

Figura 2. Elementos del aparcamiento y señales de control.


Las señales digitales que controlan los elementos del aparcamiento mostrados en la Figura 2 son:
 BxS: señal que desactiva (“0”) o activa (“1”) el motor de la barrera de entrada (BES) o de salida (BSS)
para subirla.
 BxB: señal que desactiva (“0”) o activa (“1”) el motor de la barrera de entrada (BEB) o de salida (BSB)
para bajarla.
 Sx: señal que indica si el sensor de infrarrojos de entrada (SE) o de salida (SS) no detecta ningún
obstáculo (“0”) o detecta algún obstáculo (“1”).
 Px: señal generada por el pulsador de entrada (PE) o de salida (PS).
 CL: señal que apaga (“0”) o enciende (“1”) el cartel “Libre”.
 CC: señal que apaga (“0”) o enciende (“1”) el cartel “Completo”.
Por último, en la Figura 3 se muestra el esquema hardware del microcontrolador y su conexionado mediante
las señales de control de los distintos elementos del aparcamiento.

Figura 3. Conexionado entre el microcontrolador y los elementos del aparcamiento.

-2/8-
A continuación se muestra el código correspondiente al sistema de control del aparcamiento:
#include "io430g2533.h" } // for (;;)
} // int main(void)
/* ====== CONSTANTES ============================= */
/* ====== FUNCIONES ============================= */
#define MAX 100
#define INT 0xC000 void Config_uC(void) {
WDTCTL = WDTPW + WDTHOLD;
/* ====== TIPOS DATOS ============================ */ DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ;
typedef union { DCOCTL = CALDCO_1MHZ;
unsigned volatile char total; P2DIR = BIT7;
struct { P2SEL = BIT7 + BIT6;
unsigned char f0 :1; } // void Config_uC(void)
unsigned char f1 :1;
unsigned char f2 :1; void Config_Timers(void) {
unsigned char f3 :1; TA0CCTL0 = TA0CCTL1 = OUTMOD_0;
}; TA0CCTL0_bit.OUT = TA0CCTL1_bit.OUT = 0;
} flags; TA1CCTL0 = TA1CCTL1 = OUTMOD_0;
TA1CCTL0_bit.OUT = TA1CCTL1_bit.OUT = 0;
/* ====== VARIABLES GLOBALES ===================== */ TA0CTL = TA1CTL = TASSEL_1 + ID_1 + MC_2 + TACLR;
} // void Config_Timers(void)
flags tareas;
void Config_Puertos(void) {
/* ====== PROTOTIPOS ============================= */ P1DIR = P1SEL = BIT2 + BIT1;
P1IFG = 0;
void Config_uC(void); P1REN = P1OUT = P1IES = P1IE = BIT4 + BIT3;
void Config_Timers(void); P1IES |= BIT6 + BIT5;
void Config_Puertos(void); P2DIR |= BIT3 + BIT2 + BIT1 + BIT0;
P2SEL |= BIT1 + BIT0;
/* ====== PROGRAMA PRINCIPAL ===================== */ P2OUT = BIT2;
} // void Config_Puertos(void)
int main(void) {
unsigned char val = MAX; /* ====== RUTINAS TRATAMIENTO INTERRUPCION ====== */
Config_uC();
Config_Timers(); #pragma vector = PORT1_VECTOR
Config_Puertos(); __interrupt void RTI_P1(void) {
tareas.total = 0; if (P1IFG_bit.P3 && P1IE_bit.P3) { // P1.3 -> PE
for (;;) { tareas.f0 = 1;
__low_power_mode_3(); P1IE_bit.P3 = 0;
while (tareas.total) { } // if (P1IFG_bit.P3 && P1IE_bit.P3)
if (tareas.f0) { if (P1IFG_bit.P4 && P1IE_bit.P4) { // P1.4 -> PS
tareas.f0 = 0; tareas.f2 = 1;
TA0CCR0 = TA0R + INT; // TA0.0 -> BES P1IE_bit.P4 = 0;
TA0CCTL0 = CCIE + OUT; } // if (P1IFG_bit.P4 && P1IE_bit.P4)
} // if (tareas.f0) if (P1IFG_bit.P5 && P1IE_bit.P5) { // P1.5 -> SE
if (tareas.f1) { tareas.f1 = 1;
tareas.f1 = 0; P1IE_bit.P5 = 0;
TA0CCR1 = TA0R + INT; // TA0.1 -> BEB } // if (P1IFG_bit.P5 && P1IE_bit.P5)
TA0CCTL0 = 0; if (P1IFG_bit.P6 && P1IE_bit.P6) { // P1.6 -> SS
TA0CCTL1 = CCIE + OUT; tareas.f3 = 1;
val--; P1IE_bit.P6 = 0;
if (val != 0) { } // if (P1IFG_bit.P6 && P1IE_bit.P6)
P1IFG_bit.P3 = 0; // P1.3 -> PE if (tareas.total) {
P1IE_bit.P3 = 1; __low_power_mode_off_on_exit();
} // if (val != 0) } // if (tareas.total)
else { } // void RTI_P1(void)
P2OUT = BIT3; // P2.3 -> CC
} // else - if (val != 0) #pragma vector = TIMER0_A0_VECTOR
} // if (tareas.f1) __interrupt void RTI_TA0CCR0(void) {
if (tareas.f2) { TA0CCTL0 = 0;
tareas.f2 = 0; P1IFG_bit.P5 = 0; // P1.5 -> SE
TA1CCR0 = TA1R + INT; // TA1.0 -> BSS P1IE_bit.P5 = 1;
TA1CCTL0 = CCIE + OUT; } // void RTI_TA0CCR0(void)
} // if (tareas.f2)
if (tareas.f3) { #pragma vector = TIMER0_A1_VECTOR
tareas.f3 = 0; __interrupt void RTI_TA0CCR1(void) {
TA1CCR1 = TA1R + INT; // TA1.1 -> BSB TA0CCTL1 = 0;
TA1CCTL0 = 0; } // void RTI_TA0CCR1(void)
TA1CCTL1 = CCIE + OUT;
if (val == 0) { #pragma vector = TIMER1_A0_VECTOR
P1IFG_bit.P3 = 0; // P1.3 -> PE __interrupt void RTI_TA1CCR0(void) {
P1IE_bit.P3 = 1; TA1CCTL0 = 0;
P2OUT = BIT2; // P2.2 -> CL P1IFG_bit.P6 = 0; // P1.6 -> SS
} // if (val == 0) P1IE_bit.P6 = 1;
val++; } // void RTI_TA1CCR0(void)
if (val != MAX) {
P1IFG_bit.P4 = 0; // P1.4 -> PS #pragma vector = TIMER1_A1_VECTOR
P1IE_bit.P4 = 1; __interrupt void RTI_TA1CCR1(void) {
} // if (val != MAX) TA1CCTL1 = 0;
} // if (tareas.f3) } // void RTI_TA1CCR1(void)
} // while (tareas.total)

-3/8-
1. Indique el estado inicial de los distintos elementos del aparcamiento (barreras, sensores y carteles) tras
el encendido del sistema. [0.5 puntos]
Tras el encendido del sistema el estado de los distintos elementos es:
 Barreras: detenidas (en el mismo estado en el que se apagó el sistema, por defecto bajadas):
TA0CCTL0_bit.OUT = TA0CCTL1_bit.OUT = 0;
TA1CCTL0_bit.OUT = TA1CCTL1_bit.OUT = 0;
 Sensores: deshabilitados y activos en flanco de bajada:
P1REN = P1OUT = P1IES = P1IE = BIT4 + BIT3;
P1IES |= BIT6 + BIT5;
 Carteles: cartel “Libre” encendido y cartel “Completo” apagado:
P2OUT = BIT2;

2. Indique las interrupciones habilitadas en el sistema tras su encendido. [0.5 puntos]


Las interrupciones habilitadas en el sistema antes de introducirlo en el modo LPM3 son:
 Pulsadores: habilitados y activos en flanco de bajada:
P1REN = P1OUT = P1IES = P1IE = BIT4 + BIT3;

3. Indique el significado que tiene en el sistema la variable val. [0.5 puntos]


La variable val indica el número de plazas libres que hay en el aparcamiento.

-4/8-
4. Calcule el tiempo que emplea cada barrera en subir o en bajar por completo. [1.0 puntos]
La operación de subida/bajada de cada barrera está controlada por los temporizadores. Analizando el
código correspondiente a la configuración de los temporizadores en la función Config_Timers()
se puede deducir que cada temporizador opera en el modo continuo con una señal de reloj:
 TA0CTL = TA1CTL = TASSEL_1 + ID_1 + MC_2 + TACLR;  ACLK/2
Por su parte, la señal de reloj fuente ACLK se deriva de la fuente de reloj LFXT1CLK mediante un
cristal de cuarzo externo de 32768 Hz, por lo que la señal de reloj de cada temporizador es:
 ACLK/2 = 16384 Hz
Teniendo en cuenta que cada temporizador se configura para interrumpir tras 0xC000 ciclos:
 TAxCCRy = TAxR + INT;  [INT = 0xC000 = 49152]
el tiempo total que tarda cada temporizador en generar la interrupción que indica que la barrera se ha
subido/bajado por completo es:
 t = ciclos * periodo = ciclos / frecuencia = 49152 / 16384 = 3 s

5. Proponga alguna modificación que mejore el rendimiento energético del sistema sin alterar su
operación. [1.0 puntos]
Los temporizadores TA0 y TA1 operan continuamente y nunca se detienen, por lo que consumen
recursos aunque no sea necesario contar el tiempo de subida/bajada de las barreras. Una medida para
reducir el consumo del sistema sería detener los temporizadores cuando no sean necesarios y volver a
activarlos cuando haya que contar el tiempo de subida/bajada de las barreras.

6. Indique qué es lo que ocurre en el sistema al producirse las siguientes circunstancias, detallando las
operaciones que se realizan y el nuevo estado en el que queda el sistema:
a) Un vehículo presiona el pulsador de entrada PE cuando sólo queda una plaza disponible. [0.75
puntos]
b) Un vehículo presiona el pulsador de entrada PE cuando no quedan plazas disponibles. [0.75 puntos]
c) Un vehículo presiona el pulsador de salida PS después de que otro vehículo haya presionado el
pulsador de entrada PE sin quedar plazas disponibles. [1.0 puntos]
d) Un vehículo atraviesa completamente el sensor de infrarrojos mientras la barrera está subiendo. [1.0
puntos]
e) Un vehículo comienza a atravesar el sensor de infrarrojos mientras la barrera está bajando. [1.0
puntos]
-5/8-
a) Se abre la barrera de entrada, y cuando el vehículo atraviesa el sensor de infrarrojos se cierra la
barrera de entrada, disminuyendo en una unidad las plazas disponibles. Puesto que sólo quedaba
una plaza disponible, el aparcamiento estará completo, por lo que no se habilita el pulsador de
entrada PE para evitar que otro vehículo pueda entrar, a la vez que se apaga el cartel “Libre” y se
enciende el cartel “Completo”.
b) Al no estar el pulsador de entrada PE habilitado cuando el aparcamiento está completo no ocurre
nada.
c) Para el vehículo que pretende entrar y que presiona el primer lugar el pulsador de entrada PE, al
no estar dicho pulsador de entrada PE habilitado cuando el aparcamiento está completo no ocurre
nada. Para el vehículo que pretende salir se abre la barrera de salida, y cuando el vehículo
atraviesa el sensor de infrarrojos se cierra la barrera de salida, aumentando en una unidad las
plazas disponibles. Puesto que no quedaban plazas disponibles, el aparcamiento dispondrá de una
plaza libre, por lo que se habilita el pulsador de entrada PE para permitir que otro vehículo pueda
entrar, a la vez que se apaga el cartel “Ocupado” y se enciende el cartel “Libre”. El hecho de que
haya una plaza disponible no implica que se inicie el proceso de entrada para el vehículo que
pretende entrar, siendo necesario que vuelva a presionar el pulsador de entrada PE que ahora sí
estará habilitado.
d) Puesto que la interrupción del sensor de infrarrojos se habilita cuando la barrera ha terminado de
subir, si cualquier vehículo atraviesa por completo el sensor de infrarrojos cuando la barrera está
subiendo no se detectará dicha circunstancia, por lo que al terminar de subir la barrera
permanecerá abierta hasta que otro vehículo atraviese por completo el sensor de infrarrojos.
e) Puesto que la barrera comienza a bajar cuando un vehículo atraviesa por completo el sensor de
infrarrojos, y además la interrupción del sensor de infrarrojos se deshabilita cuando un vehículo lo
atraviesa por completo, si cualquier vehículo atraviesa el sensor de infrarrojos cuando la barrera
está bajando no se detectará dicha circunstancia, por lo que la barrera seguirá bajando.

7. La aplicación actual tiene el siguiente defecto de diseño: tras la entrada o la salida de un vehículo y
mientras la correspondiente barrera está bajando un nuevo vehículo podría intentar atravesarla e incluso
ser golpeado por la misma. Explique el motivo por el que se produce este comportamiento. [1.0 puntos]
Este comportamiento se debe a que los sensores se deshabilitan una vez que cualquier vehículo los
atraviesa por completo, comenzando en ese momento a bajar la correspondiente barrera. Así pues, al
estar deshabilitados no pueden indicarle a la aplicación que otro vehículo intenta atravesar la barrera
mientras está bajando, por lo que dicha barrera seguirá bajando y podría golpear al nuevo vehículo
que intenta atravesarla.

-6/8-
8. A continuación se proponen una serie de modificaciones en distintas secciones del código para
solucionar el defecto de diseño comentado en la pregunta anterior. Comente qué efecto tienen cada una
de estas modificaciones independientemente, así como el efecto final sobre la aplicación en el caso de
que un nuevo vehículo intente atravesar una barrera mientras está bajando. [1.0 puntos]
a) Sección 1: Programa principal
if (tareas.f1) {
tareas.f1 = 0;
P1IES_bit.P5 = 0; // MODIFICADO
P1IFG_bit.P5 = 0; // MODIFICADO
P1IE_bit.P5 = 1; // MODIFICADO
TA0CCR1 = TA0R + INT;

} // if (tareas.f1)

if (tareas.f3) {
tareas.f3 = 0;
P1IES_bit.P6 = 0; // MODIFICADO
P1IFG_bit.P6 = 0; // MODIFICADO
P1IE_bit.P6 = 1; // MODIFICADO
TA1CCR1 = TA1R + INT;

} // if (tareas.f3)

b) Sección 2: Rutina de interrupción de los sensores


#pragma vector = PORT1_VECTOR
__interrupt void RTI_P1(void) {

if (P1IFG_bit.P5 && P1IE_bit.P5) {
if (!P1IES_bit.P5) { // MODIFICADO
TA0CTL = TA1CTL = 0; // MODIFICADO
P1IE = 0; // MODIFICADO
__low_power_mode_4(); // MODIFICADO
} // if (!P1IES_bit.P5) // MODIFICADO
else { // MODIFICADO
tareas.f1 = 1; // MODIFICADO
P1IE_bit.P5 = 0; // MODIFICADO
} // else - if (!P1IES_bit.P5) // MODIFICADO
} // if (P1IFG_bit.P5 && P1IE_bit.P5)
if (P1IFG_bit.P6 && P1IE_bit.P6) {
if (!P1IES_bit.P6) { // MODIFICADO
TA0CTL = TA1CTL = 0; // MODIFICADO
P1IE = 0; // MODIFICADO
__low_power_mode_4(); // MODIFICADO
} // if (!P1IES_bit.P6) // MODIFICADO
else { // MODIFICADO
tareas.f3 = 1; // MODIFICADO
P1IE_bit.P6 = 0; // MODIFICADO
} // else - if (!P1IES_bit.P6) // MODIFICADO
} // if (P1IFG_bit.P6 && P1IE_bit.P6)

c) Sección 3: Rutinas de interrupción de los temporizadores


#pragma vector = TIMER0_A1_VECTOR
__interrupt void RTI_TA0CCR1(void) {
P1IE_bit.P5 = 0; // MODIFICADO
P1IES_bit.P5 = 1; // MODIFICADO
TA0CCTL1 = 0;
} // void RTI_TA0CCR1(void)

#pragma vector = TIMER1_A1_VECTOR
__interrupt void RTI_TA1CCR1(void) {
P1IE_bit.P6 = 0; // MODIFICADO
P1IES_bit.P6 = 1; // MODIFICADO
TA1CCTL1 = 0;
} // void RTI_TA1CCR1(void)

-7/8-
a) El efecto de esta modificación consiste en habilitar el sensor de infrarrojos en las tareas que inician
la bajada de las barreras, y cambiar el flanco activo al de subida para poder detectar el momento
en el que un vehículo entra en el sensor de infrarrojos y comienza a atravesar la barrera.
b) El efecto de esta modificación consiste en detener las barreras, deshabilitar los pulsadores y los
sensores y bloquear el sistema si los sensores se encuentran activos en el flanco de subida.
c) El efecto de esta modificación consiste en deshabilitar el sensor de infrarrojos y cambiar el flanco
activo al de bajada, para poder detectar el momento en el que un vehículo sale del sensor de
infrarrojos.
El efecto conjunto de estas modificaciones en la aplicación permite que si algún sensor de infrarrojos
detecta la presencia de un vehículo cuando su correspondiente barrera está bajando el sistema se
bloquee inmediatamente (deteniendo las barreras y la operación de los pulsadores y de los sensores) y
permanezca en bajo consumo hasta que se apague y encienda de nuevo.

-8/8-
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 11 DE SEPTIEMBRE DE 2013
EXAMEN DE MICROCONTROLADORES TIEMPO: 2 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
c) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA
d) NO OLVIDE JUSTIFICAR TODAS SUS RESPUESTAS

DATOS: CONSTANTES DEL FICHERO DE CABECERA “io430g2533.h”:


 #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */
 #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */
 #define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
 #define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA Timer1_A CC0 */

DESCRIPCIÓN DEL PROGRAMA DE TEST DE UN SISTEMA MORSE


A continuación se presenta un programa de test que permite verificar el correcto funcionamiento de un
sistema de transmisión de código MORSE basado en el microcontrolador MSP430G2553.
El código MORSE está compuesto únicamente por dos símbolos (Punto y Raya). Los distintos caracteres del
alfabeto MORSE se forman con diferentes combinaciones de los símbolos punto y raya (ver figura 1), los
cuales están separados entre sí por pausas de una determinada duración temporal, manteniendo una
determinada temporización que se detalla a continuación.
 El símbolo punto puede tener cualquier duración temporal, utilizándose esta duración como la unidad
de referencia temporal.
 El símbolo raya tiene una duración temporal referenciada y mayor que el punto.
 Entre los distintos símbolos de un mismo carácter debe existir una separación temporal cuya
duración debe estar referenciada al punto. A esta separación temporal se le denomina tiempo de
pausa entre símbolos (TPS).
 Entre los distintos caracteres de una misma palabra existe una separación temporal cuya duración
también se referencia al punto pero que debe ser mayor que la separación entre símbolos. A esta
separación temporal se le denomina tiempo de pausa entre caracteres (TPC).
 Entre las palabras que componen un mensaje también existe una separación temporal referenciada al
punto y de mayor duración que la separación entre símbolos y caracteres. A esta separación se le
denomina tiempo de pausa entre palabras (TPP).

-1/8-
Figura 1. Código MORSE de los caracteres implementados en el transmisor MORSE

Con todo ello, las especificaciones1 que se siguieron a la hora de implementar el sistema de transmisión
MORSE son las siguientes:
Unidad de referencia temporal
Se representa por T y tendrá un valor de 250 ms.
Intervalos temporales para los símbolos
Para la generación de los símbolos se establecen los siguientes intervalos temporales:
1. Punto: t < 2T
2. Raya: 2T ≤ t
La generación del símbolo punto se debe gestionar cuando se suelte el pulsador MORSE, momento en el
que se puede calcular el tiempo que ha permanecido presionado. Sin embargo, la generación del símbolo
raya se debe gestionar automáticamente, de forma que al transcurrir un período de tiempo igual a 2T con
el pulsador MORSE presionado se generará un símbolo raya, independientemente del tiempo total
durante el que permanezca presionado el pulsador MORSE.
Intervalos temporales para las pausas
Para la generación de las pausas se establecen los siguientes intervalos temporales:
1. Entre símbolos de un carácter: t < 4T
2. Entre caracteres de una palabra: 4T ≤ t < 20T
3. Entre palabras de un mensaje: 20T ≤ t
La generación de las pausas entre símbolos y entre caracteres se deben gestionar cuando se presione el
pulsador MORSE, momento en el que se puede calcular el tiempo que ha permanecido soltado. Sin
embargo, la generación de la pausa entre palabras se debe gestionar automáticamente, de forma que al
transcurrir un período de tiempo igual a 20T con el pulsador MORSE soltado se generará una pausa entre
palabras, independientemente del tiempo total durante el que permanezca soltado el pulsador MORSE.
Las pausas entre palabras se codificarán con el carácter espacio (‘ ’).
Errores
Sólo se van a implementar los caracteres que se indican en la figura 1, estableciendo los siguientes
errores en la generación del mensaje en código MORSE:
1. ERROR tipo Carácter: se produce cuando la secuencia de símbolos introducida (puntos y/o rayas) no
se corresponde con ningún carácter del alfabeto.

1 Coincidentes con las especificaciones de la práctica autónoma propuesta el presente curso


-2/8-
2. ERROR tipo Longitud: se produce cuando se introducen más de cinco símbolos consecutivamente,
pues ningún carácter del alfabeto utilizado posee más de cinco símbolos (ver figura 1).
Ambos tipos de error serán codificados con el carácter especial ‘#’.
Funcionamiento
Cada vez que se genere un carácter se transmitirá al PC a través de la USCI (UART). Si se produce
cualquier error durante la generación del mensaje se transmitirá el carácter ‘#’ al PC.
El código Test_TX_MORSE.c que se muestra a continuación corresponde al programa de test del sistema de
transmisión MORSE. Este código permitirá validar cada una de las especificaciones que se han indicado en
los puntos anteriores:
// Test_TX_MORSE.c DCOCTL = 0;
#include "io430g2533.h" BCSCTL1 = CALBC1_8MHZ;
/* ====== CONSTANTES ============================= */ DCOCTL = CALDCO_8MHZ;
#define ON 1 } // void Config_uC(void)
#define OFF 0
#define LED_ON 1 void Config_Perifericos(void) {
#define LED_OFF 0 // LEDS
#define T_TA1 50000 P1DIR_bit.P0 = P1DIR_bit.P6 = ON;
/* ====== VARIABLES GLOBALES ===================== */ P1OUT_bit.P0 = LED_OFF;
// SÍMBOLO PUNTO '.' -> 1, 5, 9 P1OUT_bit.P6 = LED_ON;
// SÍMBOLO RAYA '-' -> 11, 15, 22
// PAUSA SÍMBOLO -> 2, 10, 18 //PULSADOR
// PAUSA CARÁCTER -> 22, 60, 90 P1DIR_bit.P3 = OFF;
// PAUSA PALABRA -> 110, 120, 130 P1REN_bit.P3 = ON;
P1OUT_bit.P3 = ON;
Const unsigned char secuencia[]={ P1IES_bit.P3 = ON;
9, 10, 1, 18, 5, 2, 9, 10, 1, 18, 5, 110, //'#' P1IFG_bit.P3 = OFF;
//' ' P1IE_bit.P3 = ON;
1, 22, //'E'
11, 2, 1, 10, 5, 18, 15, 60, //'X' //TEMPORIZADOR T1
9, 2, 22, 22, //'A' TA1CTL = TASSEL_2 | ID_3;
15, 2, 15, 90, //'M' TA1CCR0 = T_TA1-1;
5, 60, //'E' TA1CCTL0 = OUTMOD_0 + OUT;
15, 2, 9, 120, //'N' P2SEL_bit.P3 = ON;
//' ' P2SEL2_bit.P3 = OFF;
1, 2, 5, 10, 9, 90, //'S' P2DIR_bit.P3 = ON;
1, 22, //'E' } // void Config_Perifericos(void)
1, 2, 11, 10, 15, 2, 5, 90, //'P'
11, 90, //'T' /* ====== RUTINAS TRATAMIENTO INTERRUPCION ====== */
1, 2, 5, 60, //'I' #pragma vector = PORT1_VECTOR
5, 60, //'E' __interrupt void RTI_P1(void) {
11, 2, 22, 22, //'M' P1IFG_bit.P3 = OFF;
11,18, 1, 2, 5, 18, 9, 60, //'B' P1IE_bit.P3 = OFF;
9, 18, 22, 10, 5, 22, //'R'
1, 130, //'E' P1OUT_bit.P6 = LED_OFF;
//' '
5, 18, 9, 2, 11, 10, 15, 18, 22, 90, //'2' cont_sec = 0;
11, 2, 15, 10, 22, 18, 11, 2, 15, 22, //'0' num_TA1 = secuencia[cont_sec];
1, 10, 22, 18, 11, 2, 15, 10, 22, 60, //'1' TA1CTL_bit.TACLR = ON;
5, 18, 9, 2, 1, 10, 11, 18, 15, 90, //'3' TA1CTL_bit.MC0 = ON;
1, 2, 5, 10, 11, 18, 9, 2, 1, 120, //'#' TA1CCTL0_bit.CCIFG = OFF;
//' ' TA1CCTL0_bit.CCIE = ON;
0 //EOT TA1CCTL0_bit.OUT = OFF;
}; P1OUT_bit.P0 = ~(TA1CCTL0_bit.OUT);
unsigned char cont_sec; } // void RTI_P1(void)
unsigned char num_TA1;
#pragma vector = TIMER1_A0_VECTOR
/* ====== PROTOTIPOS ============================ */ __interrupt void RTI_T1_TACCR0(void) {
void Config_uC(void); num_TA1--;
void Config_Perifericos(); if (num_TA1 == 0) {
TA1CCTL0_bit.OUT = ~(TA1CCTL0_bit.OUT);
/* ====== PROGRAMA PRINCIPAL ===================== */ cont_sec++;
int main(void) { num_TA1 = secuencia[cont_sec];
Config_uC(); if (num_TA1 == 0) {
Config_Perifericos(); TA1CCTL0_bit.OUT = ON;
__enable_interrupt(); TA1CCTL0_bit.CCIE = OFF;
P1OUT_bit.P6 = LED_ON; TA1CTL_bit.MC0 = OFF;
for (;;) { P1OUT_bit.P6 = LED_ON;
__low_power_mode_1(); P1IFG_bit.P3 = OFF;
} // for (;;) P1IE_bit.P3 = ON;
} // int main(void) } // if (num_TA1 == 0)
P1OUT_bit.P0 = ~(TA1CCTL0_bit.OUT);
/* ====== FUNCIONES ============================ */ } // if (num_TA1 == 0)
void Config_uC(void) { } // __interrupt void RTI_T0_TACCR0(void)
WDTCTL = WDTPW + WDTHOLD;

-3/8-
La figura 2 muestra el esquema de conexión entre la placa de test y la placa del transmisor MORSE de la
que se desea verificar su funcionamiento.

Figura 2. Esquema de conexión de la placa de test y la placa bajo prueba de funcionamiento


NOTA: El código de este examen trata únicamente de la placa de TEST.

Teniendo en cuenta el código anterior Test_TX_MORSE.c y el esquema del sistema, conteste de forma
justificada a cada una de las preguntas que se plantean sobre la implementación del programa de test
de la placa de test. Este programa permite la verificación del programa implementado para el sistema de
transmisión MORSE sobre la placa bajo prueba.
CONFIGURACIÓN PERIFÉRICOS PROGRAMA TEST
1. ¿A qué frecuencia están configuradas las señales de reloj SMCLK y MCLK? Responda y justifique la
respuesta. (0,5p)
En la función Config_uC() se configura el DCO para operar con la frecuencia calibrada de 8 MHz
mediante las instrucciones:
DCOCTL = 0;
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
Por lo que tanto SMCLK como MCLK operarán a 8 MHz, al ser generadas dichas señales de reloj a
partir del DCO.

2. ¿Cómo están configurados los LEDs conectados a los terminales del microcontrolador P1.0 y P1.6 y el
pulsador conectado al terminal del microcontrolador P1.3? Responda y justifique la respuesta. (0,75p)
En la función Config_Perifericos() se configuran dichos pines.
Los pines P1.0 y P1.6 conectados a los LEDs se configuran como salida (valor ON de los bits 0 y 6 del
registro P1DIR), estableciendo además un valor inicial a nivel bajo para el pin P1.0 (valor LED_OFF
del bit 0 del registro P1OUT) y a nivel alto para el pin P1.6 (valor LED_ON del bit 6 del registro
P1OUT), lo que produce inicialmente el apagado del LED ROJO y el encendido del LED VERDE.
El pin P1.3 se configura como entrada (valor OFF bit 3 del registro P1DIR), con una resistencia de
pullup (valor ON del bit 3 de los registros P1REN y P1OUT) y como entrada de interrupción (valor ON
del bit 3 del registro P1IE) en el flanco de bajada (valor ON del bit 3 del registro P1IES).
-4/8-
3. ¿Cómo está configurado el Temporizador T1, relacionándolo con el terminal P2.3? Responda y
justifique la respuesta. (1p)
En la función Config_Perifericos() se configura dicho temporizador.
La frecuencia de operación del Temporizador T1 se establece al valor de SMCLK (valor TASSEL_2
del registro TA1CTL) dividida por 8 (valor ID_3 del registro TA1CTL), lo que equivale a 1 MHz.
También se habilita la unidad de salida 0 (registro TA1CCTL0) en el modo 0 (valor OUTMOD_0 del
registro TA1CCTL0), modo que establece el valor de dicha unidad de salida al valor que tenga el bit
OUT del registro TA1CCTL0.
Por último, se conecta dicha unidad al pin P2.3 (registros P2SEL, P2SEL2 y P2DIR), estableciendo
como valor inicial para dicha salida (es decir, para el pin P2.3) un nivel alto (bit OUT del registro
TA1CCTL0).

INTERRUPCIONES PROGRAMA TEST


4. ¿Qué acción en el sistema de test provoca la habilitación de la interrupción del Temporizador T1?
Responda y justifique la respuesta. (0,5p)
Presionar el pulsador conectado al pin P1.3, ya que en la rutina de tratamiento de interrupción de dicho
pulsador RTI_P1 se habilita la interrupción del Temporizador T1 mediante la instrucción:
TA1CCTL0_bit.CCIE = ON;

5. Tras la habilitación de la interrupción del Temporizador T1, ¿en qué instante expresado en ms se
produce la ejecución de la rutina de tratamiento de interrupción RTI_T1_TACCR0? Responda y
justifique la respuesta. (1p)
En la rutina de tratamiento de interrupción del pulsador RTI_P1 se activa el Temporizador T1 en modo
ascendente mediante la instrucción:
TA1CTL_bit.MC0 = ON;
por lo que contará desde el valor 0 hasta el valor almacenado en el registro TA1CCR0, es decir,
(TA1CCR0+1) ciclos de su señal de reloj, que como se describe en la pregunta 3 opera con una
frecuencia de 1 MHz, lo que equivale a un ciclo de 1 μs.
Por otra parte, en la función Config_Perifericos()se establece el valor del registro TA1CCR0
como (T_TA1–1), es decir, 49999. Por lo tanto, el Temporizador T1 contará 50000 ciclos de 1 μs, es
decir 50 ms, hasta que su cuenta alcance el valor del registro TA1CCR0 y genere la interrupción
correspondiente a la rutina de tratamiento de interrupción RTI_T1_TACCR0.

-5/8-
6. ¿En qué momento en relación con el funcionamiento del programa de test la interrupción del pulsador
conectado al terminal del microcontrolador P1.3 está habilitada? ¿En qué momento está deshabilitada?
¿Qué función tiene este pulsador? Responda y justifique la respuesta. (0,75p)
La interrupción del pulsador se habilita en la función Config_Perifericos()al principio del
programa y en la rutina de tratamiento de interrupción del Temporizador T1 RTI_T1_TACCR0 cuando
se ha alcanzado el final del mensaje a generar, mediante la instrucción:
P1IE_bit.P3 = ON;
Por su parte, la interrupción del pulsador se deshabilita en la propia rutina de tratamiento de
interrupción del pulsador RTI_P1, mediante la instrucción:
P1IE_bit.P3 = OFF;
Así pues, la interrupción del pulsador estará habilitada al principio del programa y cuando finalice la
verificación de la placa bajo prueba (tras haber generado el mensaje de prueba), y estará deshabilitada
una vez que se haya presionado el propio pulsador. Por lo tanto, este pulsador tiene la función de iniciar
el proceso de verificación de la placa bajo prueba.
FUNCIONAMIENTO PROGRAMA TEST
7. En relación con el funcionamiento del programa de test ¿qué indican el apagado y el encendido del LED
VERDE conectado al terminal del microcontrolador P1.6? Responda y justifique la respuesta. (0,75p)
El LED VERDE conectado al pin P1.6 se enciende en la función Config_Perifericos()al
principio del programa y en la rutina de tratamiento de interrupción del Temporizador T1
RTI_T1_TACCR0 cuando se ha alcanzado el final del mensaje a generar, mediante la instrucción:
P1OUT_bit.P6 = LED_ON;
Por su parte, el LED VERDE se apaga en la rutina de tratamiento de interrupción del pulsador RTI_P1,
mediante la instrucción:
P1OUT_bit.P6 = LED_OFF;
Así pues, el LED VERDE se encenderá para indicar que el sistema puede comenzar un nuevo proceso
de verificación de la placa bajo prueba, y se apagará para indicar que el sistema se encuentra realizando
una verificación de la placa bajo prueba.
8. En relación con el funcionamiento del programa de test ¿qué indican el apagado y el encendido del LED
ROJO conectado al terminal del microcontrolador P1.0? Responda y justifique la respuesta. (1p)
El LED ROJO conectado al pin P1.0 se apaga en la función Config_Perifericos()al principio
del programa, mediante la instrucción:
P1OUT_bit.P0 = LED_OFF;
Posteriormente, el LED ROJO se actualiza en las rutinas de tratamiento de interrupción del pulsador
RTI_P1 y del Temporizador T1 RTI_T1_TACCR0 cada vez que se modifica la unidad de salida 0 (es
decir, el valor del pin P2.3), mediante la instrucción:
P1OUT_bit.P0 = ~(TA1CCTL0_bit.OUT);
Puesto que el pin P2.3 está conectado al pulsador de la placa bajo prueba, el nivel de dicho pin emula la
pulsación (pin P2.3 a nivel bajo: TA1CCTL0_bit.OUT = OFF) o no pulsación (pin P2.3 a nivel alto:
TA1CCTL0_bit.OUT = ON) del pulsador de la placa bajo prueba. Por lo tanto, el LED ROJO
indicará si el pulsador de la placa bajo prueba está presionado (LED ROJO encendido) o soltado (LED
ROJO apagado).

-6/8-
Para verificar el funcionamiento de la placa bajo prueba, el programa de test va a generar hacia la placa bajo
prueba el siguiente mensaje ‘# EXAMEN SEPTIEMBRE 2013 # ’, donde los caracteres ‘#’ van a
representar los dos tipos de errores que implementa el transmisor MORSE según las especificaciones que se
dieron al principio.
9. Dibuje el nivel (Vcc, GND) de la señal obtenida en el pin P2.3 durante la generación del carácter ‘R’ de
la palabra ‘SEPTIEMBRE’ del mensaje de prueba, indicando claramente el tiempo que permanece
dicha señal en cada nivel. Responda y justifique la respuesta. (2p)
P2.3
450 ms 900 ms 1100 ms 500 ms 250 ms 1100 ms
VCC

GND t
50 ms

Al presionar el pulsador conectado al pin P1.3 de la placa TEST se inicia la verificación del
funcionamiento de la placa bajo prueba. Para ello, se va conmutando el valor lógico del pin P2.3 de la
placa TEST, que está conectado al pulsador de la placa bajo prueba. Así pues, al ir conmutando el valor
lógico del pin P2.3 se va emulando el envío de distintos símbolos y pausas en MORSE, según el tiempo
que tarde el pin en conmutar.
Tras presionar el pulsador del pin P1.3 se inicializa el valor del pin P2.3 a nivel bajo en la rutina de
tratamiento de interrupción del pulsador RTI_P1, mediante la instrucción:
TA1CCTL0_bit.OUT = OFF;
correspondiendo este nivel bajo a presionar el pulsador del pin P1.3 de la placa bajo prueba. Además, se
inicia el Temporizador T1 y se configura para que interrumpa un número de veces determinado,
correspondiente cada interrupción a un tiempo de 50 ms. El número de veces que debe interrumpir el
Temporizador T1 será el tiempo de duración del pin P2.3 a nivel bajo (es decir, el tiempo durante el que
permanece presionado el pulsador P1.3 de la placa bajo prueba, o lo que es lo mismo la introducción de
un símbolo punto o raya). Cuando el Temporizador T1 interrumpe el número de veces especificado se
conmuta el valor del pin P2.3 en la rutina de tratamiento de interrupción del Temporizador T1
RTI_T1_TACCR0, mediante la instrucción:
TA1CCTL0_bit.OUT = ~(TA1CCTL0_bit.OUT);
que ahora fija el valor del pin P2.3 a nivel alto, correspondiendo este nivel alto a soltar el pulsador del
pin P1.3 de la placa bajo prueba. Seguidamente se vuelve a configurar el Temporizador T1 para que
interrumpa otro número de veces determinado, que delimitará el tiempo de duración del pin P2.3 a nivel
alto (es decir, el tiempo durante el que permanece soltado el pulsador P1.3 de la placa bajo prueba, o lo
que es lo mismo la introducción de una pausa). Este proceso se repite hasta que se alcanza el final del
mensaje a generar.
El tiempo durante el que permanece el pin P2.3 a un nivel bajo o alto lo determina el número de
interrupciones que debe generar el Temporizador T1 antes de conmutar el valor de dicho pin. Este
número de interrupciones es lo que se almacena en el array secuencia, correspondiendo las
posiciones pares del mismo (0, 2, 4...) al tiempo con el pin a nivel bajo, y las posiciones impartes (1, 3,
5...) al tiempo con el pin a nivel alto.

-7/8-
10. ¿Qué tipo de error representa el primer carácter ‘#’ del mensaje de prueba ‘# EXAMEN SEPTIEMBRE
2013 # ’? Responda y justifique la respuesta. (0,75p)
Según el array secuencia el número de interrupciones de 50 ms generadas para el primer carácter del
mensaje es:
Símbolos

9, 10, 1, 18, 5, 2, 9, 10, 1, 18, 5, 110,

Pausas
que se corresponde con un carácter de 6 símbolos, lo que produce un error de longitud.

11. ¿Qué tipo de error representa el último carácter ‘#’ del mensaje de prueba ‘# EXAMEN SEPTIEMBRE
2013 # ’? Responda y justifique la respuesta. (1p)
Según el array secuencia el número de interrupciones de 50 ms generadas para el último carácter del
mensaje es:
Símbolos

1, 2, 5, 10, 11, 18, 9, 2, 1, 120,

Pausas
donde la duración de los símbolos se corresponde con:
1 • 50 ms = 50 ms  Punto
5 • 50 ms = 250 ms  Punto
11 • 50 ms = 550 ms  Raya
9 • 50 ms = 450 ms  Punto
1 • 50 ms = 50 ms  Punto
que no se corresponde con ningún carácter válido del alfabeto MORSE implementado, lo que produce
un error de carácter.

-8/8-
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 12 DE JUNIO DE 2014
EXAMEN DE MICROCONTROLADORES TIEMPO: 2 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
c) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA

DATOS: CONSTANTES DEL FICHERO DE CABECERA “io430g2533.h”:


 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
 #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */
 #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */
 #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
 #define PORT2_VECTOR (3 * 2u) /* 0xFFE6 Port 2 */
 #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */
 #define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA Timer1_A CC0 */

DESCRIPCIÓN JUEGO SIMÓN


A continuación se presenta una implementación de un sistema basado en el microcontrolador
MSP430G2533 que implementa un juego de tipo SIMÓN. El juego muestra progresivamente una secuencia
de colores que jugador debe ir memorizando e introduciendo mediante los pulsadores correspondientes. La
figura1 muestra la conexión al microcontrolador MSP430G2533 de los elementos de los que dispone el
juego del SIMÓN (tres pulsadores: START, PROJO y PVERDE; y dos diodos LED: LROJO y LVERDE):

Figura 1. Esquema del sistema

-1/8-
A continuación se muestra el código correspondiente al sistema:
#include "io430g2533.h" P2OUT_bit.P4 = LED_ON;
} // if (num_sec == 16)
/* ============ CONSTANTES ======================= */ else {
#define ON 1 cont_simb = 0;
#define OFF 0 puls_habilitados = OFF;
#define LED_ON 1 mostrar_secuencia = ON;
#define LED_OFF 0 } // else: if (num_sec == 16)
#define MAX 16 } // if (cont_simb == num_sec)
else {
/* ============ TIPOS DATOS ====================== */ puls_habilitados = ON;
} // else if (cont_simb == num_sec)
typedef union { } // else: if (simbolo != simb_introd)
unsigned char total; } // if (comprobar_simbolo == ON)
struct { } // while (tareas.total != OFF)
unsigned char f0:1,f1:1,f2:1; } // for (;;)
}; } // int main(void)
} flags;
/* ============ FUNCIONES ====================== */
/* ============ VARIABLES GLOBALES ============== */ void Config_uC(void) {
WDTCTL = WDTPW + WDTHOLD;
flags tareas; DCOCTL = 0;
#define mostrar_secuencia tareas.f0 BCSCTL1 = CALBC1_1MHZ;
#define comprobar_simbolo tareas.f1 DCOCTL = CALDCO_1MHZ;
flags estado; }
#define puls_habilitados estado.f0 void Config_Puertos(void) { // Pregunta 1 }
#define sec_generada estado.f1 void Config_Timers(void) {
#define simb_introd estado.f2 TA0CTL = TASSEL_2 + ID_3 + MC_2 + TACLR;
unsigned int sec = 0; TA1CTL = TASSEL_2 + ID_3 + MC_2 + TACLR;
unsigned char simbolo; }
unsigned char num_sec = 0;
/* ======== RUTINAS TRATAMIENTO INTERRUPCION ==== */
/* ============ PROTOTIPOS ======================= */ #pragma vector = TIMER0_A0_VECTOR
void Config_uC(void); __interrupt void RTI_TA0CCR0(void) {
void Config_Puertos(); static unsigned char num_int_TA0_0 = 0;
void Config_Timers(); static unsigned char cont_sec = 0;
TA0CCR0 += 31250;
/* ============ PROGRAMA PRINCIPAL =============== */ num_int_TA0_0++;
int main(void) { if (num_int_TA0_0 == 1) {
P2OUT_bit.P3 = P2OUT_bit.P4 = LED_OFF;
unsigned char cont_simb = 0; } // if (num_int_TA0_0 == 1)
Config_uC(); else if (num_int_TA0_0 == 4) {
Config_Puertos(); num_int_TA0_0 = 0;
Config_Timers(); cont_sec++;
tareas.total = 0; if (cont_sec < num_sec) {
estado.total = 0; simbolo = (unsigned char) ((sec >> cont_sec)
puls_habilitados = OFF; & 0x0001);
for (;;) { if (simbolo == 0) {
__low_power_mode_0(); P2OUT_bit.P3 = LED_ON;
while (tareas.total != OFF) { } // if (simbolo == 0)
// ------------ [Tarea_0 -> Mostrar secuencia] else {
if (mostrar_secuencia == ON) { P2OUT_bit.P4 = LED_ON
mostrar_secuencia = OFF; } // else: if (simbolo == 0)
simbolo = (unsigned char) (sec & 0x0001); } // if (cont_sec < num_sec)
if (simbolo == 0) { else {
P2OUT_bit.P3 = LED_ON; if (num_sec == 16) {
} // if (simbolo == 0) num_sec = 0;
else { sec_generada = OFF;
P2OUT_bit.P4 = LED_ON; } // if (num_sec == 16)
} // else: if (simbolo == 0) cont_sec = 0;
num_sec++; puls_habilitados = ON;
TA0CCR0 = TA0R + 31250; TA0CCTL0_bit.CCIE = OFF;
TA0CCTL0_bit.CCIFG = OFF } // else: if (cont_sec < num_sec)
TA0CCTL0_bit.CCIE = ON; } // else if (num_int_TA0_0 == 4)
} // if (mostrar_secuencia == ON) } // __interrupt void RTI_TA0CCR0(void)
// ------------ [Tarea_1 -> Comprobar simbolo]
if (comprobar_simbolo == ON) { #pragma vector = TIMER1_A0_VECTOR
comprobar_simbolo = OFF; __interrupt void RTI_TA1CCR0(void) {
simbolo = (unsigned char) ((sec >> static unsigned char num_int_TA1_0 = 0;
cont_simb) & 0x0001); TA1CCR0 += 31250;
if (simbolo != simb_introd) { num_int_TA1_0++;
TA0CTL = TA1CTL = MC_0; if (num_int_TA1_0 == 1) {
P2IE_bit.P1 = P2IE_bit.P2 = OFF; P2OUT_bit.P3 = P2OUT_bit.P4 = LED_OFF;
P2OUT_bit.P3 = LED_ON; }
P2OUT_bit.P4 = LED_OFF; else if (num_int_TA1_0 == 2) {
} // if (simbolo != simb_introd) num_int_TA1_0 = 0;
else { TA1CCTL0_bit.CCIE = OFF;
cont_simb++; comprobar_simbolo = ON;
if (cont_simb == num_sec) { __low_power_mode_off_on_exit();
if (num_sec == MAX) { }
TA0CTL=TA1CTL= MC_0; }
P2IE_bit.P1=P2IE_bit.P2= OFF;
P2OUT_bit.P3 = LED_OFF;
-2/8-
#pragma vector = PORT2_VECTOR #pragma vector = PORT1_VECTOR
__interrupt void RTI_P2(void) { __interrupt void RTI_P1(void) {
if (puls_habilitados == ON) { P1IE_bit.P3 = OFF;
if (P2IFG_bit.P1) { P2IE_bit.P1 = P2IE_bit.P2 = ON;
P2OUT_bit.P3 = LED_ON; if (sec_generada == OFF) {
simb_introd = OFF; sec = TA0R;
} sec_generada = ON;
else { mostrar_secuencia = ON;
P2OUT_bit.P4 = LED_ON; __low_power_mode_off_on_exit();
simb_introd = ON; } // if (sec_generada == OFF)
} } // void RTI_P1(void)
TA1CCR0 = TA1R + 31250;
TA1CCTL0_bit.CCIFG = OFF;
TA1CCTL0_bit.CCIE = ON;
puls_habilitados = OFF;
} // if (puls_habilitados == ON) {
P2IFG = 0;
}

En todo momento se consideran pulsadores ideales, sin rebote. Teniendo en cuenta el código anterior y
el esquema del sistema, conteste de forma justificada a cada una de las preguntas que se plantean sobre la
implementación del sistema.

-3/8-
CONFIGURACIÓN DE LOS PUERTOS (1,5p)
1. Implemente completamente la rutina void Config_Puertos() para que los tres pulsadores
interrumpan al soltar y los dos diodos LED estén inicialmente apagados. Sólo el pulsador START
debe quedar habilitado.
a. Configuración para los LED (0,5p)

P2DIR_bit.P3 = ON; // P2.3 -> Salida


P2DIR_bit.P4 = ON; // P2.3 -> Salida
P2OUT_bit.P3 = LED_OFF; // P2.3 -> Apaga LED1
P2OUT_bit.P4 = LED_OFF; // P2.4 -> Apaga LED2

b. Configuración pulsador START utilizando bitfields (P1DIR_bit, P1OUT_bit, etc)(0,5p)

P1DIR_bit.P3 = OFF; // P1.3 -> Entrada (pulsador S2)


P1REN_bit.P3 = ON; // Resistencia activa
P1OUT_bit.P3 = ON; // Resistencia pullup
P1IES_bit.P3 = OFF; // Flanco subida
P1IFG_bit.P3 = OFF; // Limpia flag pulsador S2
P1IE_bit.P3 = ON; // Habilita interrupcion pulsador S2

c. Configuración pulsadores sin utilizar bitfields (P2DIR, P2OUT, etc) y sin estropear la
configuración ya realizada en el apartado a. para los LED. Recuerde que estos pulsadores
quedan inicialmente deshabilitados. (0,5p)

P2DIR &= ~(BIT1+BIT2); // P2.1, P2.2 -> Entradas


P2REN = BIT1+BIT2; // Resistencia activa
P2OUT |= BIT1+BIT2; // Resistencia pullup
P2IES &= ~(BIT1+BIT2); // Flanco subida
P2IFG &= ~(BIT1+BIT2); // Limpia flags antes de habilitar pulsaciones

-4/8-
ENSAMBLADOR (2p)
2. Para cada una de las instrucciones en lenguaje C que se indican a continuación, identifique en cuál o
cuales de las instrucciones en ensamblador siguientes se transforman en la compilación (Nota
importante: sólo se tendrán en cuenta las respuestas que hayan sido explicadas adecuadamente).
a. Entrada en bajo consumo: marque la opción correcta y explique detalladamente por qué dicha
opción es adecuada y las demás no lo son (1p)
__low_power_mode_0(); BIS.W #0xF8, SR
X BIS.W #0x18, SR
BIS.W #0xF0, SR
BIS.W #0x10, SR

La respuesta correcta es la segunda (BIS.W #0x18, SR). Mediante la instrucción


BIS.W #0x18, SR, se ponen a uno los bits CPUOFF y GIE del registro de estado SR.
El bit CPUOFF es precisamente el que introduce al microcontrolador en el estado
LPM0, en el cual sólo MCLK está desactivada, y SMCLK (y ACLK si estuviera
disponible) seguirían activas. La cuarta opción (BIS.W #0x10, SR),en la que sólo
se pondría a 1 el bit CPUOFF, también podría ser válida. Sin embargo, si esta
fuera la respuesta el programa del examen no podría funcionar, puesto que las
interrupciones deben estar también habilitadas mediante el bit GIE. Las otras
dos opciones se descartan puesto que ponen a 1 también los bits OSCOFF, SCG0 y
SCG1, con lo cual pondrían al microcontrolador en el estado LPM4, no el LMP0.

b. Salida del bajo consumo: marque la opción correcta y explique detalladamente su respuesta
(1p)
__low_power_mode_off_on_exit(); X BIC.W #0xF0, 0(SP)

BIC.W #0x10, 0(SP)


BIC.W #0xF0, 2(SP)
BIC.W #0x10, 2(SP)

La respuesta correcta es la primera, BIC.W #0xF0, 0(SP), puesto que, en primer


lugar, el registro de estado está almacenado en la pila en 0(SP), y no en 2(SP).
En 2(SP) está almacenado el contador de programa. En segundo lugar (y si bien la
segunda instrucción, BIC.W #010x, 0(SP), también podría funcionar dado que se
borra el bit CPUOFF, que es el único bit de los que intervienen en el bajo
consumo que, en este programa, está puesto a 1), la instrucción
__low_power_mode_off_on_exit, como su nombre indica, desactiva cualquier modo de
bajo consumo, no sólo LMPM0. Para ello debe borrar todos los bits que tienen que
ver con los modos de bajo consumo en el microcontrolador: CPUOFF, OSCOFF, SCG0 y
SCG1.

-5/8-
USO DE LOS TEMPORIZADORES (3p)
3. En el sistema se están utilizando los dos temporizadores TA0 y TA1. Responda a las siguientes
cuestiones.
a. ¿Para qué sirve la instrucción en la rutina de tratamiento de interrupción RTI_P1 sec = TA0R?
En su respuesta tenga en cuenta para qué se usa luego la variable global sec (0,5p)
Esta instrucción lee el registro contador del temporizador TA0R y lo almacena en la
variable global sec. Al estar esta instrucción en la rutina de tratamiento de
interrupción del pulsador START, dicha lectura se puede producir en cualquier momento,
permitiendo generar distintos valores para esta variable global en distintas
ejecuciones del juego. Puesto que el programa genera la secuencia de colores a partir
de esta variable [más tarde en la rutina de tratamiento de TA1CCR0, a través de la
instrucción simbolo = (unsigned char) ((sec >> cont_sec) & 0x0001)], cada vez que se
juega se hace con una secuencia de colores distinta.

b. Explique qué función cumple la rutina de tratamiento de interrupción asociada a TA1CCR0,


RTI_TA1CCR0() y cómo la cumple (1p)
Cuando se detecta una pulsación de PROJO o PVERDE a través de la RTI del puerto 2, se
enciende el LED LROJO o el LVERDE respectivamente para indicar al jugador que la
pulsación se ha detectado. En ese punto se programa la interrupción de TA1CCR0 para que
se produzca a los 250 ms:
TA1CCR0 = TA1R + 31250;
TA1CCTL0_bit.CCIFG = OFF;
TA1CCTL0_bit.CCIE = ON;
Cuando se ejecuta, la RTI de TA1CCR0 cumple dos funciones:
1) Apagar, transcurrido esos 250ms, el LED que se había encendido en RTI_PORT2:
if (num_int_TA1_0 == 1) // Si 250 ms
P2OUT_bit.P3 = P2OUT_bit.P4 = LED_OFF; // apaga los LED
2) Trancurridos otros 250 ms, programar la tarea 1 para que compruebe si el color que
ha introducido el jugador es correcto o incorrecto:
else if (num_int_TA1_0 == 2) { // Si 250ms más
num_int_TA1_0 = 0;
TA1CCTL0_bit.CCIE = OFF; // Desprograma interrupción
comprobar_simbolo = ON; // Programa comprobar simbolo
__low_power_mode_off_on_exit(); // Sale bajo consumo
}
¿Cuántos colores de la secuencia se muestran en la Tarea 0 (“mostrar_secuencia”)? ¿En qué
lugar del código se muestran el resto de colores de la secuencia? (0,5p)
En la Tarea 0 “mostrar_secuencia” sólo se muestra el primer color de la secuencia,
mediante la instrucción simbolo = (unsigned char) (sec & 0x0001) y el bloque if-else
que le sigue. El resto de colores se van mostrando en las sucesivas interrupciones de
TA0CCR0, mediante la instrucción simbolo = (unsigned char) ((sec >> cont_sec) &
0x0001). La variable cont_sec se va incrementando en estas interrupciones y esto
permite ir mostrando todo el resto de la secuencia.

c. Explique qué función cumple la rutina de tratamiento de interrupción asociada a TA0CCR0,


RTI_TA0CCR0(), y cómo la cumple (1p)
Esta RTI asociada al bloque de captura y comparación CCR0 del temporizador TA0 es
programada desde la Tarea 0 “mostrar_secuencia”, mediante las instruccciones:
TA0CCR0 = TA1R + 31250;
TA0CCTL0_bit.CCIFG = OFF;
TA0CCTL0_bit.CCIE = ON;
-6/8-
Esto ocurre justo después de mostrarse el primer color de la secuencia, como se explicó
en la pregunta anterior. La primera interrupción a los 250 ms(num_int_TA0_0 == 1)apaga
el LED que se encendiera en la Tarea 0. Sucesivas interrupciones mantienen los leds
apagados durante 750 ms, hasta que, pasado ese tiempo (num_int_TA0_1 == 4), se
comprueba si ya se han mostrado todos los colores de esa jugada. Si no se han mostrado,
se avanza, mediante las instrucciones cont_sec++ y simbolo = (unsigned char) ((sec >>
cont_sec) & 0x0001), encendiéndose el siguiente color de la secuencia. En definitiva,
esta rutina de tratamiento de interrupción es la que implementa el modo “Mostrar
Secuencia”, en la que el programa enseña al jugador la secuencia que ha de memorizar y
reproducir utilizando los pulsadores.

RECONFIGURACIÓN DE LOS TEMPORIZADORES (2p)


4. Suponga ahora que rediseñamos el sistema y añadimos un cristal externo de cuarzo de 32768 Hz a la
entrada XIN/XOUT del microcontrolador1, de manera que disponemos de la señal de reloj ACLK para
los temporizadores. Responda a las siguientes cuestiones.
a. Realice los cambios adecuados en Config_Timers() para que los dos timers TA0 y TA1
utilicen la señal ACLK. No realice más que los cambios necesarios para poder utilizar esta
señal; conserve el resto de la configuración (0,5p).
Para utilizar ACLK como señal de reloj basta con cambiar TASSEL_2 por TASSEL_1 en la
configuración de cada timer:
void Config_Timers()
{
TA0CTL = TASSEL_1 + ID_3 + MC_2 + TACLR;
TA0CTL = TASSEL_1 + ID_3 + MC_2 + TACLR;
}

b. Indique qué cambios serían necesarios en el manejo de los temporizadores TA0 y TA1, tanto
en el programa principal, como en las rutinas de interrupción RTI_P2(), RTI_TA1CCR0() y
RTI_TA0CCR0() para que la aplicación se comporte de la misma manera. No olvide justificar
los cálculos que realice (1p).
Antes de realizar el cambio a uttilizar ACLK los temporizadores estaban configurados
para realizar interrupciones cada 250 ms. Al conservar la división por 8 de la
frecuencia de ACLK en la configuración anterior, tenemos que para conseguir una
interrupción de los temporizadores igual a la que se tenía antes necesitamos cargar los
registros de captura y comparación con un valor N = 0,250 / (8 / 32768) = 1024.
Así, en cada instrucción en que se tenga un incremento del valor de TACCR0 o de
TA1CCR0, basta con utilizar este valor en lugar del de 31250 que se tenía antes. Así,
en el programa principal, deberemos escribir TA0CCR0 = TA0R + 1024 al final de la Tarea
0. En RTI_TA0CCR0(), pondremos TA0CCR0 += 1024 al principio; En RTI_TA1CCR0(),
pondremos TA1CCR0 += 1024 igualmente, al principio. Y en RTI_P2(void) pondremos TA1CCR0
= TA1R + 1024;, casi al final.

c. ¿Cuál es el modo de menor consumo que podría utilizarse ahora (en lugar de LPM0) en el
programa principal? No olvide justificar su respuesta (0,5p).
Podríamos utilizar LMP3, puesto que en dicho modo la señal ACLK permanece habilitada.
Por tanto se podría tener, al principio del bucle for del programa principal, la
instrucción __low_power_mode_3().

1 En la subrutina Config_Puertos() suponga que ya se han realizado los cambios necesarios P2SEL_bit.P6 = P2SEL_bit.P7 =
ON; y P2DIR_bit.P7 = ON;

-7/8-
MEJORAS AL PROGRAMA (1,5p)
5. Suponga ahora que se le solicita que utilice solamente un temporizador, TA0, para realizar toda la
funcionalidad del programa. Realice los cambios necesarios para sustituir la interrupción asociada a
TA1 por otra nueva asociada a TA0CCR1, que cumpla la misma finalidad.
a. Indique los cambios necesarios en la configuración de los temporizadores que se realiza en el
programa principal (0,25p)
Al tenerse ahora un solo temporizador, basta con tener únicamente una instrucción en la
función Config_Timers:
TA0CTL = TASSEL_1 + ID_3 + MC_2 + TACLR;

b. Programe la nueva rutina RTI_TA0CCR1 que debe hacer exactamente lo mismo que la
RTI_TA1CCR0 (recuerde que queremos prescindir del temporizador TA1) (1p)
#pragma vector = TIMER0_A1_VECTOR
__interrupt void RTI_TA0CCR1(void) {
static unsigned char num_int_TA0_1 = 0; // Numero interrupciones TA0CCR1
switch (__even_in_range(TA0IV,10))
{
case 2:
{
TA0CCR1 += 1024;
num_int_TA0_1++;
if (num_int_TA0_1 == 1) { // Si 250ms
P2OUT_bit.P3 = P2OUT_bit.P4 = LED_OFF;
}
else if (num_int_TA0_1 == 2) { // Si 250ms
num_int_TA0_1 = 0;
TA0CCTL1_bit.CCIE = OFF;
comprobar_simbolo = ON;
__low_power_mode_off_on_exit(); // Sale bajo consumo
} // else if (num_int_TA0_1 == 2)
break;
} // case 2
case 4: break;
case 10: break;
} // switch
}

c. Indique los cambios necesarios en la rutina de tratamiento de interrupción RTI_P2 (0,25p)


Antes de terminar la rutina de tratamiento de interrupción, la que se ha de programar
ahora para apagar el LED es la asociada a TA0CCR1:
TA0CCR1 = TA0R + 1024;
TA0CCTL1_bit.CCIFG = OFF;
TA0CCTL1_bit.CCIE = ON;

-8/8-
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 15 DE JUNIO DE 2015
EXAMEN DE MICROCONTROLADORES TIEMPO: 2 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA
c) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
d) NO OLVIDE JUSTIFICAR TODAS SUS RESPUESTAS

DATOS: CONSTANTES DEL FICHERO DE CABECERA “msp430g2533.h”:


 #define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/set */
 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
 #define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */
 #define TACLR (0x0004u) /* Timer A counter clear */
 #define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms interval */
 #define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
 #define PORT2_VECTOR (3 * 2u) /* 0xFFE6 Port 2 */

Se desea implementar un piano simplificado mediante un microcontrolador MSP430G2533. Para ello se


dispone del siguiente esquema hardware:

Las notas musicales se obtienen mediante la generación de PWMs de distinta frecuencia, los cuales se
dirigen a un altavoz. Las teclas del piano son pulsadores con el siguiente esquema de conexionado:

A continuación se muestra el código implementado en el microcontrolador:

1
#include "msp430g2533.h" /* === FUNCIONES ================================= */

/* === TIPOS DATOS =============================== */ void Config_uC(void) {

typedef union { WDTCTL = WDTPW + WDTHOLD;


unsigned char total; IE1 = WDTIE;
struct { DCOCTL = 0;
unsigned char f0: 1; BCSCTL1 = CALBC1_1MHZ;
unsigned char f1: 1; DCOCTL = CALDCO_1MHZ;
unsigned char f2: 1; P2DIR = BIT7;
unsigned char f3: 1; P2SEL = BIT7 + BIT6;
unsigned char f4: 1;
unsigned char f5: 1; } // void Config_uC(void)
unsigned char f6: 1;
unsigned char f7: 1; void Config_Perifericos(void) {
};
} flags; P1DIR = 0x00;
P1REN = 0xFF;
/* === VARIABLES GLOBALES ======================== */ P1OUT = 0x00;
P1IES = 0x00;
flags tareas; P1IFG = 0x00;
unsigned char key1, key2; P1IE = 0xFF;
unsigned int frec1[] = {63,59,56,53,50,47,44,42};
unsigned int frec2[] = {39,37,35,33}; P2REN = 0x0F;
P2OUT = 0x00;
/* === PROTOTIPOS ================================ */ P2IES = 0x00;
P2IFG = 0x00;
void Config_uC(void); P2IE = 0x0F;
void Config_Perifericos();
TA1CCR0 = 0x0000;
/* === PROGRAMA PRINCIPAL ======================== */ TA1CCR2 = 0x0000;
TA1CCTL2 = OUTMOD_7;
int main(void) { TA1CTL = TASSEL_1 + MC_3 + TACLR;
P2DIR |= BIT5;
unsigned char cont; P2SEL |= BIT5;

Config_uC(); } // void Config_Perifericos(void)


Config_Perifericos();
/* === RUTINAS TRATAMIENTO INTERRUPCION ========== */
tareas.total = 0;
#pragma vector = WDT_VECTOR
for (;;) { __interrupt void RTI_WD(void) {

__low_power_mode_3(); WDTCTL = WDTPW + WDTHOLD;


P1IFG = 0x00;
while (tareas.total != 0) { P2IFG = 0x00;
P1IE = 0xFF;
if (tareas.f0 == 1) { P2IE = 0x0F;
tareas.f0 = 0; key1 = (P1IN & 0xFF);
key2 = (P2IN & 0x0F);
if (key1 != 0) { tareas.f0 = 1;
cont = 0; __low_power_mode_off_on_exit();

while (((key1 >> cont) & 0x01) == 0) { } // __interrupt void RTI_WD(void)


cont++;
} // while (((key1 >> cont) & 0x01)... #pragma vector = PORT1_VECTOR
__interrupt void RTI_P1(void) {
TA1CCR0 = frec1[cont];
} // if (key1 != 0) P1IE = 0x00;
P2IE = 0x00;
else if (key2 != 0) { WDTCTL = WDT_ADLY_16;
cont = 0; P1IES ^= P1IFG;

while (((key2 >> cont) & 0x01) == 0) { } // void RTI_P1(void)


cont++;
} // while (((key2 >> cont) & 0x01)... #pragma vector = PORT2_VECTOR
__interrupt void RTI_P2(void) {
TA1CCR0 = frec2[cont];
} // else if (key2 != 0) P1IE = 0x00;
P2IE = 0x00;
else { WDTCTL = WDT_ADLY_16;
TA1CCR0 = 0x0000; P2IES ^= P2IFG;
} // else: else if (key2 != 0)
} // void RTI_P2(void)
} // if (tareas.f0 == 1)

} // while (tareas.total != 0)

} // for (;;)

} // int main(void)

2
NOTA: En C el operador “>>” realiza un desplazamiento binario a la derecha. Su sintaxis es “var >> N”,
e indica que la variable “var” se desplaza “N” bits a la derecha. Así por ejemplo, si la variable “var”
tiene el valor “01101001” y “N” tiene el valor “2” la operación que se realiza es:

Teniendo en cuenta el código anterior, conteste de forma justificada a las siguientes preguntas.
1. Reescriba la función “Config_Perifericos()” en ensamblador. [1.5 puntos]
NOTA: No es necesario que sustituya las etiquetas de los registros de los periféricos (PxDIR, PxREN,
PxOUT, PxIES, PxIFG, PxIE, PxSEL, TA1CCRx, TA1CCTLx, TA1CTL) por su valor, aunque sí
es necesario sustituir las etiquetas de los campos de configuración de dichos registros (BITx,
OUTMOD_x, TASSEL_x, MC_x, TACLR) por su valor.
C  Ensamblador
P1DIR = 0x00;  MOV.B #0x00, &P1DIR
P1REN = 0xFF;  MOV.B #0xFF, &P1REN
P1OUT = 0x00;  MOV.B #0x00, &P1OUT
P1IES = 0x00;  MOV.B #0x00, &P1IES
P1IFG = 0x00;  MOV.B #0x00, &P1IFG
P1IE = 0xFF;  MOV.B #0xFF, &P1IE
P2REN = 0x0F;  MOV.B #0x0F, &P2REN
P2OUT = 0x00;  MOV.B #0x00, &P2OUT
P2IES = 0x00;  MOV.B #0x00, &P2IES
P2IFG = 0x00;  MOV.B #0x00, &P2IFG
P2IE = 0x0F;  MOV.B #0x0F, &P2IE
TA1CCR0 = 0x0000;  MOV.W #0x0000, &TA1CCR0
TA1CCR2 = 0x0000;  MOV.W #0x0000, &TA1CCR2
TA1CCTL2 = OUTMOD_7;  MOV.W #0x00E0, &TA1CCTL2
TA1CTL = TASSEL_1 + MC_3 + TACLR;  MOV.W #0x0134, &TA1CTL
P2DIR |= BIT5;  BIS.B #0x20, &P2DIR
P2SEL |= BIT5;  BIS.B #0x20, &P2SEL

2. Justifique si en la función “Config_Perifericos()” es posible sustituir las instrucciones


“P2DIR |= BIT5; P2SEL |= BIT5;” por “P2DIR = BIT5; P2SEL = BIT5;”
respectivamente. [0.5 puntos]
No es posible ya que:
 Las instrucciones “P2DIR |= BIT5; P2SEL |= BIT5;” configuran el bit 5 (BIT5) de los
registros “P2DIR” y “P2SEL”, sin alterar el valor del resto de bits de dichos registros, los cuales
han sido previamente configurados por la función “Config_uC()” para activar el cristal de
cuarzo como fuente de la señal de reloj ACLK.

3
 Las instrucciones “P2DIR = BIT5; P2SEL = BIT5;” configuran el bit 5 (BIT5) de los
registros “P2DIR” y “P2SEL”, poniendo a “0” el valor del resto de bits de dichos registros
(desactivando por lo tanto el cristal de cuarzo como fuente de la señal de reloj ACLK).

3. Deduzca la función que cumplen las variables “key1” y “key2”, modificadas en la rutina de
interrupción “RTI_WD()”, completando además la siguiente tabla que indica el valor de dichas
variables en función de la tecla presionada. [1.5 puntos]
NOTA: No se considerará válida la respuesta sin la correspondiente justificación de la misma, debiendo
analizar detalladamente los casos de presionar las teclas “C” y “A#”.

Tecla key1 key2

C 0x01 0x00
C# 0x02 0x00
D 0x04 0x00
D# 0x08 0x00
E 0x10 0x00
F 0x20 0x00
F# 0x40 0x00
G 0x80 0x00
G# 0x00 0x01
A 0x00 0x02
A# 0x00 0x04
B 0x00 0x08

Estas variables contienen el valor leído de los puertos P1 y P2 donde están conectadas las teclas del
piano, eliminando mediante la operación AND (“&”) los valores leídos en aquellos pines que no tienen
teclas conectadas.
Según el conexionado de los pulsadores que forman las teclas se genera un “0” cuando las mismas están
soltadas y un “1” cuando están presionadas. Así pues, las variables “key1” y “key2” contienen las
teclas que en cada momento se encuentran presionadas en el piano, siendo la variable “key1” utilizada
para las teclas del puerto P1 (C..G) y la variable “key2” utilizada para las teclas del puerto P2 (G#..B).
Para el caso de presionar la tecla “C” se genera un “1” en el pin P1.0, por lo que el registro “P1IN”
valdrá “0x01”, siendo éste el valor asignado a la variable “key1”.
Para el caso de presionar la tecla “A#” se genera un “1” en el pin P2.2, por lo que el registro “P2IN”
valdrá “0x04”, siendo éste el valor asignado a la variable “key2”.

4
4. Analice la función que cumplen los bucles “while (((key1 >> cont) & 0x01) == 0)
{cont++;}” y “while (((key2 >> cont) & 0x01) == 0) {cont++;}” de la tarea
“tareas.f0”, completando además la siguiente tabla que indica el valor de la variable “cont” en
función de la tecla presionada. [2.0 puntos]
NOTA: No se considerará válida la respuesta sin la correspondiente justificación de la misma, debiendo
analizar detalladamente los casos de presionar las teclas “C” y “A#”.

Tecla cont

C 0
C# 1
D 2
D# 3
E 4
F 5
F# 6
G 7
G# 0
A 1
A# 2
B 3

Estos bucles sirven para buscar en las variables “key1” y “key2” el primer bit a “1” (comenzando por
el bit menos significativo LSB). Como las variables “key1” y “key2” contienen un “1” para las teclas
presionadas en el piano, estos bucles se utilizan para localizar las teclas presionadas en un momento
determinado.
Para el caso de presionar la tecla “C” la variable “key1” tiene el valor “0x01”, por lo que se ejecuta el
primer bucle “while” que buscará el primer “1” de dicha variable. El primer “1” se encuentra ubicado en
la bit “0”, por lo que la variable “cont” tomará dicho valor (“0”).
Para el caso de presionar la tecla “A#” la variable “key2” tiene el valor “0x04”, por lo que se ejecuta
el segundo bucle “while” que buscará el primer “1” de dicha variable. El primer “1” se encuentra
ubicado en el bit “2”, por lo que la variable “cont” tomará dicho valor (“2”).

5
5. Calcule para cada tecla del piano tanto la frecuencia y el ciclo de trabajo del PWM generado como los
valores de los registros “TA1CCR0” y “TA1CCR2” asociados a la misma. [2.5 puntos]
NOTA: No se considerará válida la respuesta sin la correspondiente justificación de la misma, debiendo
analizar detalladamente los casos de presionar las teclas “C” y “A#”.

Tecla Frecuencia Ciclo TA1CCR0 TA1CCR2


C 260.06 Hz 50 % 63 0
C# 277.69 Hz 50 % 59 0
D 292.57 Hz 50 % 56 0
D# 309.13 Hz 50 % 53 0
E 327.68 Hz 50 % 50 0
F 348.60 Hz 50 % 47 0
F# 372.36 Hz 50 % 44 0
G 390.10 Hz 50 % 42 0
G# 420.10 Hz 50 % 39 0
A 442.81 Hz 50 % 37 0
A# 468.11 Hz 50 % 35 0
B 496.48 Hz 50 % 33 0

La frecuencia del PWM está determinado por el valor del registro “TA1CCR0” del temporizador TA1.
El temporizador opera con la señal de reloj ACLK de 32768 Hz (TASSEL_1), por lo que cada cuenta
del mismo equivale a:
Tc = (1 / 32768)
Al estar el temporizador configurado en modo ascendente/descendente el número de ciclos que cuenta
el temporizador una vez determinado el valor del registro “TA1CCR0” es:
N = (2*TA1CCR0)
Así pues, el periodo del PWM generado es:
T = N * Tc = (2*TA1CCR0) * (1 / 32768) = (2*TA1CCR0) / 32768
Por lo tanto, la frecuencia del PWM generado es:
f = 32768 / (2*TA1CCR0)
Para determinar el valor de la frecuencia del PWM de cada tecla es necesario conocer el valor del
registro “TA1CCR0” asociado a cada uno. Dicho valor se obtiene en la tarea “tareas.f0” mediante
los arrays “frec1[]” y “frec2[]”.
Por último, el ciclo de trabajo está determinado por el valor del registro “TA1CCR2” del temporizador
TA1. Dicho valor es siempre “0”, por lo que se puede deducir de la ecuación que determina el ciclo de
trabajo para el modo reset/set (OUTMOD_7) con cuenta ascendente/descendente (MC_3):
Ciclo = (TA1CCR0 – TA1CCR2) / (2*TA1CCR0) = [TA1CCR2 = 0] = 50 %
6
Para el caso de presionar la tecla “C” la variable “key1” tiene el valor “0x01”, por lo que se ejecuta el
primer bucle “while” y se le asigna a la variable “cont” el valor “0”. Por lo tanto el registro
“TA1CCR0” tomará el valor “frec1[0]” que vale “63” y se corresponde con una frecuencia de
260.06 Hz.
Para el caso de presionar la tecla “A#” la variable “key2” tiene el valor “0x04”, por lo que se ejecuta
el segundo bucle “while” y se le asigna a la variable “cont” el valor “2”. Por lo tanto el registro
“TA1CCR0” tomará el valor “frec2[2]” que vale “35” y se corresponde con una frecuencia de
468.11 Hz.

6. Después de inicializar el sistema y entrar en el modo de bajo consumo se producen las siguientes
acciones en el sistema:
a) Se presiona la tecla “G#”
b) Se presionan simultáneamente las teclas “D#” y “F”
c) Se suelta la tecla “F”
Indique el valor de las variables “key1”, “key2”, “cont” y del registro “TA1CCR0” tras ejecutar el
código completo asociado a las rutinas de interrupción y las tareas y regresar al bajo consumo después
de cada una de dichas acciones: [2.0 puntos]
Presionar Presionar Soltar
“G#” “D#” y “F” “F”
key1 0x00 0x28 0x08
key2 0x01 0x01 0x01
cont 0 3 3
TA1CCR0 39 53 53

Al presionar la tecla “G#” se genera un “1” en el pin P2.0 y se activa la interrupción del puerto P2. Esta
interrupción deshabilita todas las teclas (“P1IE = 0x00; P2IE = 0x00;”), activa el antirrebote
de 16 ms (“WDTCTL = WDT_ADLY_16;”) y conmuta el flanco de detección de la tecla presionada
“G#” (“P2IES ^= P2IFG;”). Cuando se ejecuta la interrupción del Watchdog asociada al antirrebote
se limpian los flags de interrupción de todas las teclas (“P1IFG = 0x00; P2IFG = 0x00;”), se
vuelven a habilitar las mismas (“P1IE = 0xFF; P2IE = 0x0F;”) y se actualizan las variables
“key1” y “key2” según las teclas actualmente presionadas, por lo que “key1 = 0x00” (ninguna
tecla) y “key2 = 0x01” (tecla “G#”). Con estos valores en las variables “key1” y “key2” la tarea
“tareas.f0” le asigna a la variable “cont” el valor “0” y al registro “TA1CCR0” el valor del array
“frec2[0]” que es “39”.
Al presionar las teclas “D#” y “F” se genera un “1” en los pines P1.3 y P1.5 y se activa la interrupción
del puerto P1. Esta interrupción deshabilita todas las teclas (“P1IE = 0x00; P2IE = 0x00;”),
activa el antirrebote de 16 ms (“WDTCTL = WDT_ADLY_16;”) y conmuta el flanco de detección de
las teclas presionadas “D#” y “F” (“P1IES ^= P1IFG;”). Cuando se ejecuta la interrupción del
7
Watchdog asociada al antirrebote se limpian los flags de interrupción de todas las teclas (“P1IFG =
0x00; P2IFG = 0x00;”), se vuelven a habilitar las mismas (“P1IE = 0xFF; P2IE =
0x0F;”) y se actualizan las variables “key1” y “key2” según las teclas actualmente presionadas, por
lo que “key1 = 0x28” (teclas “D#” y “F”) y “key2 = 0x01” (tecla “G#”). Con estos valores en
las variables “key1” y “key2” la tarea “tareas.f0” le asigna a la variable “cont” el valor “3” y al
registro “TA1CCR0” el valor del array “frec1[3]” que es “53”.
Al soltar la tecla “F” se genera un “0” en el pin P1.5 y se activa la interrupción del puerto P1. Esta
interrupción deshabilita todas las teclas (“P1IE = 0x00; P2IE = 0x00;”), activa el antirrebote
de 16 ms (“WDTCTL = WDT_ADLY_16;”) y conmuta el flanco de detección de la tecla presionada
“F” (“P1IES ^= P1IFG;”). Cuando se ejecuta la interrupción del Watchdog asociada al antirrebote
se limpian los flags de interrupción de todas las teclas (“P1IFG = 0x00; P2IFG = 0x00;”), se
vuelven a habilitar las mismas (“P1IE = 0xFF; P2IE = 0x0F;”) y se actualizan las variables
“key1” y “key2” según las teclas actualmente presionadas, por lo que “key1 = 0x08” (tecla “D#”)
y “key2 = 0x01” (tecla “G#”). Con estos valores en las variables “key1” y “key2” la tarea
“tareas.f0” le asigna a la variable “cont” el valor “3” y al registro “TA1CCR0” el valor del array
“frec1[3]” que es “53”.

8
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 19 DE SEPTIEMBRE DE 2014
EXAMEN DE MICROCONTROLADORES TIEMPO: 2 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
c) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA

DATOS: CONSTANTES DEL FICHERO DE CABECERA “msp430g2533.h”:


 #define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */
 #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */
 #define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */
 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0)A CC1, TA0 */
 #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */

Se dispone de un sistema basado en el microcontrolador MSP430G2533, cuyo esquema hardware se muestra


en la figura 1.
Sobre dicho sistema se implementa una aplicación basada en el juego del Simón, donde se muestra una
secuencia aleatoria de colores que el jugador debe repetir. Si acierta en la secuencia introducida, se le añade
un nuevo color a la misma y se vuelve a mostrar, debiendo el jugador introducirla de nuevo.

Figura 1. Esquema hardware del sistema

1/8
A continuación se muestra el código correspondiente al sistema:
#include "msp430g2533.h" /* ===== FUNCIONES ============================= */

/* ===== TIPOS DATOS ============================= */ void Config_uC(void) {


WDTCTL = WDTPW + WDTHOLD;
typedef union { DCOCTL = 0;
unsigned char total; BCSCTL1 = CALBC1_1MHZ;
struct { DCOCTL = CALDCO_1MHZ;
unsigned char f0:1,f1:1,f2:1; P2DIR = (BIT7);
}; P2SEL = (BIT7+BIT6);
} flags; } // void Config_uC(void)

/* ===== VARIABLES GLOBALES ====================== */ void Config_Perifericos(void) {


P1DIR = 0x00;
flags tareas; P1REN = P1OUT = P1IES = 0x0F;
flags estado; P1IFG = 0x00;
unsigned long sec_v, sec_t, tmp; P1IE = 0x0F;
unsigned char sec_m, sec_n, sec_c, puls; P2DIR |= 0x0F;
P2OUT = 0x00;
/* ===== PROTOTIPOS ============================== */ TA0CTL = TASSEL_1 + ID_1 + MC_2 + TACLR;
} // void Config_Perifericos(void)
void Config_uC(void);
void Config_Perifericos(void); /* ===== RUTINAS TRATAMIENTO INTERRUPCION ======= */

/* ===== PROGRAMA PRINCIPAL ====================== */ #pragma vector = TIMER0_A0_VECTOR


__interrupt void RTI_TA0CCR0(void) {
int main(void) { TA0CCTL0 &= ~(CCIE);
Config_uC(); if (P2OUT == 0x0F) {
Config_Perifericos(); estado.f1 = 0;
tareas.total = 0; estado.f2 = 1;
estado.total = 0; sec_c = 0;
for (;;) { } // if (P2OUT == 0x0F)
__low_power_mode_3(); else if (P2OUT == 0x00) {
while (tareas.total != 0) { estado.f1 = 1;
if (tareas.f0 == 1) { estado.f2 = 0;
tareas.f0 = 0; tareas.f0 = 1;
tmp = (sec_v>>2*sec_c)&0x03; } // else if (P2OUT == 0x00)
P2OUT = (0x01<<tmp); else {
tmp = (sec_t>>2*sec_c)&0x03; tareas.f1 = 1;
TA0CCR1 = TA0R + (0x8000>>tmp); } // else: if (P2OUT == 0x0F)
TA0CCR2 = TA0CCR1 + (0x8000>>tmp); P2OUT = 0x00;
TA0CCTL1 &= ~(CCIFG); if (tareas.total != 0) {
TA0CCTL1 |= (CCIE); __low_power_mode_off_on_exit();
TA0CCTL2 &= ~(CCIFG); } // if (tareas.total)
TA0CCTL2 |= (CCIE); } // __interrupt void RTI_TA0CCR0(void)
} // if (tareas.f0 == 1)
if (tareas.f1 == 1) { #pragma vector = TIMER0_A1_VECTOR
tareas.f1 = 0; __interrupt void RTI_TA0CCR12(void) {
if (((sec_v>>2*sec_c)&0x03) == puls) { switch (__even_in_range(TA0IV, 10)) {
sec_c++; case (2): {
if (sec_c == sec_n) { TA0CCTL1 &= ~(CCIE);
tmp = TA0R; P2OUT = 0x00;
sec_v += ((tmp>>0)&0x03)<<2*sec_c; break;
sec_t += ((tmp>>2)&0x03)<<2*sec_c; } // case (2)
sec_c = 0;
sec_n++; case (4): {
if (sec_n <= sec_m) { TA0CCTL2 &= ~(CCIE);
P2OUT = 0x00; sec_c++;
TA0CCR0 = TA0R + (0x2000); if (sec_c < sec_n) {
TA0CCTL0 &= ~(CCIFG); tareas.f0 = 1;
TA0CCTL0 |= (CCIE); } // if (sec_c < sec_m)
} // if (sec_n <= sec_m) else {
else { P2OUT = 0x0F;
P2OUT = 0x08; TA0CCR0 = TA0R + 0x0800;
P1IE = 0x00; TA0CCTL0 &= ~(CCIFG);
TA0CTL = MC_0; TA0CCTL0 |= (CCIE);
__low_power_mode_4(); } // else: if (sec_c < sec_n)
} // else: if (sec_n <= sec_m) break;
} // if (sec_c == sec_n) } // case (4)
} // if (((sec_v>>2*sec_c)&0x03) == puls) } // switch (__even_in_range(TA0IV, 10))
else { if (tareas.total != 0) {
P2OUT = 0x01; __low_power_mode_off_on_exit();
P1IE = 0x00; } // if (tareas.total)
TA0CTL = MC_0; } // __interrupt void RTI_TA0CCR12(void)
__low_power_mode_4();
} // else: if (((sec_v>>2*sec_c)&0x03)... #pragma vector = WDT_VECTOR
} // if (tareas.f1 = 1) __interrupt void RTI_WD(void) {
} // while (tareas.total != 0) WDTCTL = WDTPW + WDTHOLD;
} // for (;;) P1IFG = 0x00;
} // int main(void) P1IE = 0x0F;
} // __interrupt void RTI_WD(void)

2/8
#pragma vector = PORT1_VECTOR if ((P1IFG & P1IES) != 0) {
__interrupt void RTI_P1(void) { if (P1IFG & 0x01) puls = 0;
P1IE = 0x00; if (P1IFG & 0x02) puls = 1;
WDTCTL = WDT_ADLY_16; if (P1IFG & 0x04) puls = 2;
IFG1 &= ~(WDTIFG); if (P1IFG & 0x08) puls = 3;
IE1 |= (WDTIE); P2OUT = (0x01<<puls);
if (estado.f0 == 0) { TA0CCR0 = TA0R + 0x0400;
estado.f0 = 1; TA0CCTL0 &= ~(CCIFG);
tmp = TA0R; TA0CCTL0 |= (CCIE);
sec_m = 4*(1+((tmp>>4)&0x03)); } // if ((P1IFG & P1IES) == 1)
sec_v = (tmp>>0)&0x03; } // if (estado.f2 == 1)
sec_t = (tmp>>2)&0x03; P1IES ^= P1IFG;
sec_n = 1; P1IFG = 0x00;
sec_c = 0; if (tareas.total != 0) {
estado.f1 = 1; __low_power_mode_off_on_exit();
tareas.f0 = 1; } // if (tareas.total)
} // if (estado.f0 == 0) } // __interrupt void RTI_P1(void)
if (estado.f2 == 1) {

Para simplificar tanto el diseño como el análisis del sistema se considera que nunca se podrá presionar
más de un pulsador simultáneamente. Teniendo en cuenta el código anterior y el esquema del sistema,
conteste de forma justificada cada una de las siguientes cuestiones.
1. Describa cuándo y cómo se determina la longitud de la secuencia generada. [1.0 puntos]
La longitud de la secuencia generada se almacena en la variable sec_m, la cual se inicializa en la
rutina de tratamiento de interrupción del puerto 1 correspondiente a los pulsadores RTI_P1().
Analizando el código de dicha rutina de tratamiento de interrupción, se observa que dicha variable se
inicializa cuando el flag estado.f0 se encuentra a “0”, poniéndose posteriormente a “1” y no
volviéndose a modificar en el resto del código. Por lo tanto, esta flag indica si es la primera vez que se
presiona alguno de los pulsadores, en cuyo caso se procede a inicializar el sistema y con ello la variable
sec_m que almacena la longitud de la secuencia generada.
Respecto a la forma en la que se inicializa esta variable, se puede observar en el código que en primer
lugar se captura el valor del temporizador 0 TA0R en el momento en el que se presiona algún pulsador,
valor que es totalmente aleatorio al comenzar a operar dicho temporizador en la inicialización del
sistema. Con el valor aleatorio de dicho temporizador se realiza la siguiente operación:
tmp = TA0R;
sec_m = 4*(1+((tmp>>4)&0x03));
la cual sirve para quedarse con los bits 4 y 5 de dicho valor aleatorio ((tmp>>4)&0x03), que será así
pues otro valor aleatorio de 2 bits, con valores comprendidos entre “0” y “3”. A este valor se le suma
“1” para obtener otro valor entre “1” y “4”, y por último se multiplica por “4” para generar un valor
entre “4” y “16”.
Por lo tanto, la longitud de la secuencia generada puede ser “4”, “8”, “12” ó “16”, longitud que se
determina la primera vez que se presiona algún pulsador.

-3/8-
2. Indique cuándo y cómo se genera la secuencia. [1.5 puntos]
La secuencia generada se almacena en la variable sec_v. Dicha secuencia no se genera de una vez,
sino que se va generando poco a poco. El primer valor de la secuencia se genera la primera vez que se
presiona algún pulsador, junto con la inicialización de la longitud de la secuencia generada. Dicha
operación se realiza en la rutina de tratamiento de interrupción del puerto 1 correspondiente a los
pulsadores RTI_P1(), cuando el flag estado.f0 se encuentra a “0”:
tmp = TA0R;
...
sec_v = (tmp>>0)&0x03;
El resto de los valores de la secuencia se genera en el código correspondiente a la tarea tareas.f1,
cada vez que se introduce una secuencia completa (sec_c == sec_n):
tmp = TA0R;
sec_v += ((tmp>>0)&0x03)<<2*sec_c;
Respecto a la forma en la que se genera esta variable, se utiliza el valor aleatorio del temporizador,
quedándose con los bits 0 y 1 de dicho valor aleatorio ((tmp>>0)&0x03), que será así pues otro valor
aleatorio de 2 bits, con valores comprendidos entre “0” y “3”, correspondiéndose con los LEDs a
encender: “0”  Rojo ; “1”  Amarillo ; “2”  Azul ; “3”  Verde. Conforme se van generando
estos valores, se van almacenando en la variable sec_v debidamente desplazados (<<2*sec_c).

3. Explique la finalidad de cada uno de los bits utilizados en el código para las variables tareas y
estado. [1.25 puntos]
Según el análisis del código se puede deducir que:
 tareas.f0: tarea que se encarga de mostrar un LED de la secuencia.

 tareas.f1: tarea que se encarga de comprobar si el pulsador presionado es correcto según la


secuencia generada.
 estado.f0: estado que indica si el sistema se ha inicializado (“1”) o no (“0”) , presionando para
ello algún pulsador y generando, pues, la longitud de la secuencia y el primer valor de la misma.
 estado.f1: estado que indica si el sistema se encuentra en el modo de mostrar la secuencia
generada (“1”) o no (“0”).
 estado.f2: estado que indica si el sistema se encuentra en el modo de introducir secuencia (“1”) o
no (“0”).

-4/8-
4. Calcule el tiempo que puede permanecer encendido cada LED de la secuencia generada mientras se
muestra. [2.5 puntos]
El tiempo que cada LED permanece encendido se almacena en la variable sec_t. Dicho valor, al igual
que la secuencia generada, no se obtiene de una vez, sino que se va obteniendo poco a poco. El primer
valor se obtiene la primera vez que se presiona algún pulsador, en la rutina de tratamiento de
interrupción del puerto 1 correspondiente a los pulsadores RTI_P1(), cuando el flag estado.f0 se
encuentra a “0”:
tmp = TA0R;
...
sec_t = (tmp>>2)&0x03;
El resto de los valores se obtiene en el código correspondiente a la tarea tareas.f1, cada vez que se
introduce una secuencia completa (sec_c == sec_n):
tmp = TA0R;
...
sec_t += ((tmp>>2)&0x03)<<2*sec_c;
Respecto a la forma en la que se obtienen estos valores, se utiliza el valor aleatorio del temporizador,
quedándose con los bits 2 y 3 de dicho valor aleatorio ((tmp>>2)&0x03), que será así pues otro valor
aleatorio de 2 bits, con valores comprendidos entre “0” y “3”. Conforme se van obteniendo estos
valores, se van almacenando en la variable sec_t debidamente desplazados (<<2*sec_c).
Por otra parte, la encargada de mostrar los LEDs de la secuencia es la tarea tareas.f0, que en
primer lugar enciende el LED correspondiente según el valor almacenado en la variable sec_v:
tmp = (sec_v>>2*sec_c)&0x03;
P2OUT = (0x01<<tmp);
Seguidamente, según el valor almacenado en la variable sec_t, programa el módulo TA0CCR1 del
temporizador 0 para que deje encendido durante un tiempo determinado el LED:
tmp = (sec_t>>2*sec_c)&0x03;
TA0CCR1 = TA0R + (0x8000>>tmp);
Por último, programa el módulo TA0CCR2 del temporizador 0 para que deje apagado durante un
tiempo determinado el LED:
TA0CCR2 = TA0CCR1 + (0x8000>>tmp);
Según se puede observar, el valor programado en los módulos del temporizador depende del valor
almacenado en la variable sec_t, el cual se recupera en la variable temporal tmp. Así pues:
 tmp = 0  TA0CCR1 = TA0R + 0x8000;  TA0CCR2 = TA0CCR1 + 0x8000;

 tmp = 1  TA0CCR1 = TA0R + 0x4000;  TA0CCR2 = TA0CCR1 + 0x4000;

 tmp = 2  TA0CCR1 = TA0R + 0x2000;  TA0CCR2 = TA0CCR1 + 0x2000;

 tmp = 3  TA0CCR1 = TA0R + 0x1000;  TA0CCR2 = TA0CCR1 + 0x1000;

Es decir, que se pueden esperar “0x8000”, “0x4000”, “0x2000” o “0x1000” ciclos. Analizando la
configuración del temporizador 0 en la función Config_Perifericos():
TA0CTL = TASSEL_1 + ID_1 + MC_2 + TACLR;
se observa que opera con la señal de reloj ACLK (TASSEL_1) dividida por 2 (ID_1) en modo continuo
(MC_2). Así pues, la frecuencia de la señal de reloj que utiliza el temporizador es:

-5/8-
 f = (32768 Hz)/2 = 16384 Hz
Por lo que el número de ciclos anteriormente indicado se corresponde con:
 0x8000 ciclos = 32768 ciclos  2 s
 0x4000 ciclos = 16384 ciclos  1 s
 0x2000 ciclos = 8192 ciclos  0.5 s
 0x1000 ciclos = 4096 ciclos  0.25 s

5. Describa el comportamiento del sistema en las siguientes circunstancias: [1.5 puntos]


a) Cuando el jugador acierta/falla la introducción de la secuencia generada. (0.5 puntos)
Este comportamiento se encuentra en la tarea tareas.f1, que comprueba si el pulsador
presionado es correcto.
Si es correcto y se corresponde con el último LED de la secuencia (sec_n > sec_m) el sistema
enciende el LED verde (P2OUT = 0x08;) y se bloquea indefinidamente, al deshabilitar los
pulsadores (P1IE = 0x00;), detener el temporizador 0 (TA0CTL = MC_0;) y entrar en el modo
de bajo consumo LPM4 (__low_power_mode_4();).
Si es erróneo (((sec_v>>2*sec_c)&0x03) != puls) el sistema enciende el LED rojo (P2OUT
= 0x01;) y se bloquea indefinidamente, al deshabilitar los pulsadores (P1IE = 0x00;), detener el
temporizador 0 (TA0CTL = MC_0;) y entrar en el modo de bajo consumo LPM4
(__low_power_mode_4();).

b) Cuando se acaba de mostrar la secuencia. (0.5 puntos)


Cuando finaliza el tiempo de apagado del último LED de la secuencia se ejecuta la rutina de
interrupción del módulo TA0CCR2 del temporizador 0 cumpliéndose la condición:
(sec_c == sec_n)
Bajo estas circunstancias, en dicha rutina se encienden los cuatro LEDs (P2OUT = 0x0F;) y se
programa el módulo TA0CCR0 del temporizador 0 para que interrumpa (TA0CCTL0 |= (CCIE);)
al cabo de “0x0800” ciclos (TA0CCR0 = TA0R + 0x0800;). Según la frecuencia de operación del
temporizador (ver pregunta 4), este número de ciclos se corresponde con:
 0x0800 ciclos = 2048 ciclos  0.125 s
En la rutina de tratamiento de interrupción del módulo TA0CCR0 del temporizador 0 se cumple la
condición:
(P2OUT == 0x0F)

-6/8-
conmutando desde el estado mostrar secuencia (estado.f1 = 0;) al estado introducir secuencia
(estado.f2 = 1;) y apagándose además todos los LEDs (P2OUT = 0x00;). Así pues, el efecto
final es que cuando se acaba de mostrar la secuencia se encienden todos los LEDs durante 125 ms.

c) Cuando el jugador presiona un pulsador mientras se introduce la secuencia. (0.5 puntos)


Al presionar un pulsador mientras se introduce la secuencia se enciende el LED correspondiente al
pulsador presionado (P2OUT = (0x01<<puls);) y se programa el módulo TA0CCR0 del
temporizador 0 para que interrumpa (TA0CCTL0 |= (CCIE);) al cabo de “0x0400” ciclos
(TA0CCR0 = TA0R + 0x0400;). Según la frecuencia de operación del temporizador (ver
pregunta 4), este número de ciclos se corresponde con:
0x0400 ciclos = 1024 ciclos  0.0625 s = 62.5 ms
En la rutina de tratamiento de interrupción del módulo TA0CCR0 del temporizador 0 se cumplen las
condiciones:
(P2OUT != 0x0F) y (P2OUT != 0x00)
activando la tarea tareas.f1 (que se encarga de comprobar si el pulsador presionado es correcto)
y apagándose además todos los LEDs (P2OUT = 0x00;). Así pues, el efecto final es que cuando se
presiona un pulsador se enciende el LED correspondiente durante 62.5 ms.

-7/8-
6. Explique la función de las siguientes instrucciones del código: [0.75 puntos]
a) P2DIR |= 0x0F; (0.25 puntos)
Esta instrucción configura los 4 pines menos significativos del puerto 2 (P2.0 a P2.3) como pines de
salida, sin modificar además la configuración de los 4 pines más significativos del puerto 2 (P2.4 a
P2.7). Sirve, pues, para configurar los pines P2.0 a P2.3 de forma que activen los LEDs del sistema.

b) P1IES ^= P1IFG; (0.5 puntos)


Esta instrucción realiza una XOR a nivel de bit entre el registro de control del flanco del puerto 1
(P1IES) y el registro con los flags de interrupción del puerto 1 (P1IFG). Puesto que según el
enunciado únicamente un pulsador puede ser presionado simultáneamente en el sistema, sólo un bit
del registro P1IFG se encontrará activo, por lo que la instrucción únicamente conmuta el
correspondiente bit del flanco del pulsador que ha sido presionado en el registro P1IES. Por lo
tanto, sirve para indicarle al sistema que, una vez presionado/soltado un pulsador, se desea detectar
la próxima vez que es soltado/presionado.

7. Indique cómo se implementan las siguientes instrucciones en ensamblador: [1.5 puntos]


NOTA: Suponga que las variables estado y tareas están almacenadas en el registro R10 y en la
posición de memoria 0x0210 respectivamente. Además, el registro TA0CCTL0 está mapeado en la
posición de memoria 0x0162.
a) estado.f2 = 0; (0.25 puntos)
BIC.B #0x04,R10

b) tareas.f0 = 1; (0.25 puntos)


BIS.B #0x01,0x0210

c) TA0CCTL0 |= (CCIE); (0.5 puntos)


BIS.W #0x0010,&0x0162

d) TA0CCTL0 &= ~(CCIE); (0.5 puntos)


BIC.W #0x0010,&0x0162

-8/8-
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 20 DE DICIEMBRE DE 2012
EXAMEN DE MICROCONTROLADORES TIEMPO: 3 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
c) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA

DATOS:
a) CONSTANTES DEL FICHERO DE CABECERA “io430g2533.h”:
− #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
− #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */
− #define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */
− #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */
− #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */
− #define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */
− #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
− #define USCIAB0TX_VECTOR (6 * 2u) /* 0xFFEC USCI A0/B0 Transmit */
− #define TIMER1_A1_VECTOR (12 * 2u) /* 0xFFF8 Timer1_A CC1, CC2, TA1 */

Se desea diseñar un juego de ingenio basado en el microcontrolador MSP430G2533. Dicho juego pretende
acertar un código de longitud variable generado aleatoriamente, compuesto por dígitos comprendidos entre 0
y 3. Para ello se dispone de un teclado numérico y un LCD que se conectan al microcontrolador a través del
bus I2C (los detalles y el funcionamiento de esta conexión I2C no son relevantes para resolver este examen).
Adicionalmente, se dispone de dos pulsadores, Inicio y Reset. La Figura 1 muestra el esquema del sistema.

Figura 1. Esquema del sistema.

-1/7-
En el esquema de la Figura 1 se puede apreciar que el teclado y el LCD están conectados directamente con
el microcontrolador mediante el bus I2C. El funcionamiento de estos elementos es el siguiente:
– Cuando se pulsa una tecla en el teclado se transmite al microcontrolador a través del bus I2C,
activando la rutina de interrupción RTI_I2C. Esta rutina de interrupción analiza las teclas pulsadas,
y si se corresponden con dígitos comprendidos entre 0 y 3 se almacenan en el array sec2. Cuando el
número de dígitos almacenados coincide con la longitud del código generado se activa la tarea
tareas.f1 del sistema.
– La función Write_LCD(char *string) se encarga de enviar a través del bus I2C una cadena de
caracteres para que el LCD la muestre por pantalla.
El funcionamiento del juego se describe a continuación:
1. Inicialmente el microcontrolador genera un código aleatorio formado por una secuencia de dígitos
entre 0 y 3.
2. Después de generar el código el usuario utilizará el teclado para introducir una secuencia de dígitos
entre 0 y 3, con el objetivo de intentar acertar el código generado.
3. Una vez introducida la secuencia del usuario el microcontrolador la compara con el código generado
e indica en el LCD cuántos dígitos iguales (y que además coincidan con la misma posición del
código generado) tiene la secuencia introducida, aunque no indica qué dígitos son los que coinciden.
4. Si ambas secuencias coinciden totalmente, se habrá acertado el código generado.
En la Figura 2 se muestra un ejemplo en la que el usuario necesita de siete intentos para adivinar el código
generado “2 – 0 – 1”:

0 , 0 ,0 Aciertos: 1

1 , 1 ,1 Aciertos: 1

2 , 2 ,2 Aciertos: 1

3 , 3 ,3 Aciertos: 0

Aciertos: 1
2 , 3 ,3
2 , 1 ,0 Aciertos: 1

2 , 0 ,1 Aciertos: 3 Código acertado!

Figura 2. Ejemplo.

-2/7-
A continuación se muestra el código correspondiente al sistema:
#include "io430g2533.h" Write_LCD("Juego superado!");
#include "stdio.h" __disable_interrupt();
__low_power_mode_4();
/* ====== CONSTANTES ============================= */ } // if (tam > COD)
tareas.f0 = 1;
#define COD 8 } // if (suc == tam)
} // if (tareas.f1)
/* ====== TIPOS DATOS ============================ */ if (tareas.f2) {
tareas.f2 = 0;
typedef union { Write_LCD("--- GAMEOVER ---");
unsigned volatile char total; __disable_interrupt();
struct { __low_power_mode_4();
unsigned char f0 :1; } // if (tareas.f2)
unsigned char f1 :1; } // while (tareas.total)
unsigned char f2 :1; } // for (;;)
}; } // int main(void)
} flags;
/* ====== FUNCIONES ============================= */
/* ====== VARIABLES GLOBALES ===================== */
void Config_uC(void) {
flags tareas; WDTCTL = WDTPW + WDTHOLD;
unsigned char tam, niv, time, sec1[COD], sec2[COD]; DCOCTL = 0;
char text[16+1]; BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
/* ====== PROTOTIPOS ============================= */ P2DIR = BIT7;
P2SEL = BIT7 + BIT6;
void Config_uC(void); } // void Config_uC(void)
void Config_Timers(void);
void Config_Ports(void); void Config_Timers(void) {
void Config_I2C(void); TA0CTL = TASSEL_2 + ID_1 + MC_2 + TACLR;
void Write_LCD(char *string); TA1CCR0 = 0xF000;
TA1CTL = TASSEL_1 + ID_3 + TACLR + TAIE;
/* ====== PROGRAMA PRINCIPAL ===================== */ } // void Config_Timers(void)

int main(void) { void Config_Ports(void) {


unsigned char suc, cont; P1DIR = P1IFG = 0;
unsigned int aux; P1REN = P1OUT = P1IES = P1IE = BIT3;
Config_uC(); } // void Config_Ports(void)
Config_Timers();
Config_Ports(); void Config_I2C(void) {
Config_I2C(); // …
tareas.total = 0; } // void Config_I2C(void)
niv = 1;
tam = 3; void Write_LCD(char *string) {
time = 0; // …
Write_LCD("Pulse Inicio..."); } // void Write_LCD(char *string)
for (;;) {
__low_power_mode_0(); /* ====== RUTINAS TRATAMIENTO INTERRUPCION ====== */
while (tareas.total) {
if (tareas.f0) { #pragma vector = PORT1_VECTOR
tareas.f0 = 0; __interrupt void RTI_P1(void) {
aux = TA0R; tareas.f0 = 1;
for (cont = 0; cont < tam; cont++) { P1IE = P1IFG = 0;
sec1[cont] = (char) (aux >> (2*cont)); TA1CTL |= MC_3;
sec1[cont] &= 0x03; __low_power_mode_off_on_exit();
} // for (cont = 0; cont < tam; cont++) } // void RTI_P1(void)
TA1CTL_bit.TACLR = 1;
time = 0; #pragma vector = USCIAB0TX_VECTOR
sprintf(text, "Nivel: %d", niv); __interrupt void RTI_I2C(void) {
Write_LCD(text); static unsigned char num = 0;
} // if (tareas.f0) // …
if (tareas.f1) { if (num == tam) {
tareas.f1 = 0; tareas.f1 = 1;
suc = 0; __low_power_mode_off_on_exit();
for (cont = 0; cont < tam; cont++) { } // if (num == tam)
if (sec1[cont] == sec2[cont]) { } // void RTI_I2C(void)
suc++;
} // if (sec1[cont] == sec2[cont]) #pragma vector = TIMER1_A1_VECTOR
} // for (cont = 0; cont < tam; cont++) __interrupt void RTI_TA1IFG(void) {
sprintf(text, "Aciertos: %d", suc); TA1CTL_bit.TAIFG = 0;
Write_LCD(text); time++;
if (suc == tam) { if (time == tam) {
Write_LCD("Código acertado!"); tareas.f2 = 1;
niv++; __low_power_mode_off_on_exit();
tam += 2; } // if (time == tam)
if (tam > COD) { } // void RTI_TA1CCR1(void)

-3/7-
Puntuación:
– Respuesta correcta : +0.5 puntos
– Respuesta incorrecta : –0.17 puntos
– Respuesta en blanco : +0.0 puntos

1. Según el algoritmo utilizado para generar el código:


aux = TA0R;
for (cont = 0; cont < tam; cont++) {
sec1[cont] = (char) (aux >> (2*cont));
sec1[cont] &= 0x03;
} // for (cont = 0; cont < tam; cont++)

indicar el número máximo de dígitos que puede tener dicho código:


a. 3
b. 5
c. 7
d. Ninguna de las otras opciones es correcta
2. Si se presiona el pulsador Inicio antes de comenzar el juego cuando el valor del registro TA0R es
0x5C3A, indicar cuál es el código generado de longitud 7 dígitos:
a. 1130032
b. 2230031
c. 1300322
d. Ninguna de las otras opciones es correcta
3. Si se modifica el procedimiento de generación del código para que esté compuesto por dígitos
comprendidos entre 0 y 7:
aux = TA0R;
for (cont = 0; cont < tam; cont++) {
sec1[cont] = (char) (aux >> (3*cont));
sec1[cont] &= 0x07;
} // for (cont = 0; cont < tam; cont++)

indicar cuál sería la longitud máxima que se podría obtener para dicho código:
a. 5
b. 8
c. No se puede realizar dicha modificación
d. Ninguna de las otras opciones es correcta
4. Indicar el número de niveles que hay que pasar para superar el juego:
a. 2
b. 3
c. 4
d. Ninguna de las otras opciones es correcta
5. Indicar cuál es el grado de dificultad que se incrementa al aumentar el nivel del juego:
a. Se aumenta la longitud del código generado
b. Se reduce el tiempo permitido para acertar el código
c. Se reduce el número de intentos permitidos para acertar el código
d. Ninguna de las otras opciones es correcta

-4/7-
6. Indicar cuál es el número de intentos permitidos para intentar acertar el código en un nivel:
a. 8
b. 16
c. 20
d. Ninguna de las otras opciones es correcta
7. Indicar cuál es el tiempo permitido para intentar acertar el código en un nivel:
a. 15 segundos
b. 30 segundos
c. Depende del nivel
d. Ninguna de las otras opciones es correcta
8. Indicar qué ocurre si no se consigue acertar el código de un nivel en el tiempo permitido:
a. El juego comienza de nuevo desde el primer nivel
b. El juego comienza de nuevo desde el nivel actual
c. El juego finaliza y el sistema se bloquea
d. Ninguna de las otras opciones es correcta
9. Indicar la longitud del código en el nivel 3:
a. 3
b. 7
c. 8
d. Ninguna de las otras opciones es correcta
10. Indicar cuál es la utilidad del pulsador Inicio:
a. Generar el código y comenzar el juego
b. Comenzar otra partida una vez que se ha superado el juego
c. Reiniciar el juego durante una partida
d. Ninguna de las otras opciones es correcta
11. Indicar si es necesario incorporar un sistema antirrebote para el pulsador Inicio:
a. Sí, todos los pulsadores necesitan siempre un sistema antirrebote
b. No, pues al utilizar una resistencia de pullup interna en el pin P1.3 no se producen rebotes
c. Depende del código generado
d. Ninguna de las otras opciones es correcta
12. Indicar qué ocurre si se presiona el pulsador Inicio una vez ha comenzado el juego:
a. Nada
b. Se reinicia el juego
c. Depende del nivel en el que se encuentre la partida
d. Ninguna de las otras opciones es correcta
13. Indicar cómo se puede comenzar otra partida una vez que se ha superado el juego:
a. No se puede
b. Presionando el pulsador Inicio
c. Comienza automáticamente
d. Ninguna de las otras opciones es correcta

-5/7-
14. Indicar si es posible reiniciar el juego durante una partida:
a. No
b. Sí, siempre
c. Sí, pero únicamente tras superar el primer nivel
d. Ninguna de las otras opciones es correcta
15. Indicar qué utilidad tiene el pulsador Reset:
a. Ninguna, pues su funcionalidad es la misma que la del pulsador Inicio
b. Reinicia el juego si todavía no se ha llegado al final del mismo
c. Reinicia el juego en cualquier momento
d. Ninguna de las otras opciones es correcta
16. Indicar qué funcionalidad tiene la tarea tareas.f0 del sistema:
a. Generar un código de longitud máxima para todos los niveles al principio del juego
b. Generar un código de la longitud adecuada al principio de cada nivel
c. Generar un código cada vez que se presione el pulsador Inicio
d. Ninguna de las otras opciones es correcta
17. Indicar qué información almacena el array sec1 del sistema:
a. La secuencia introducida por el usuario
b. El valor decimal entre 0 y 9 de los dígitos menos significativos del temporizador TA0R
c. El valor decimal entre 0 y 9 de los dígitos más significativos del temporizador TA0R
d. Ninguna de las otras opciones es correcta
18. Indicar si es posible utilizar el modo de bajo consumo LPM3 en el sistema:
a. Sí
b. No, pues se deshabilitaría la interrupción correspondiente al pulsador Inicio
c. No, pues se deshabilitaría el funcionamiento del temporizador TA0
d. Ninguna de las otras opciones es correcta
19. Desde el punto de vista del usuario, indicar la diferencia que se percibe entre superar y no superar el
juego:
a. Ninguna
b. El texto que aparece en el LCD
c. Si no se supera el juego el sistema se bloquea, y si se supera comienza automáticamente de nuevo
d. Ninguna de las otras opciones es correcta
20. Indicar si existe alguna limitación de tiempo máximo para superar el juego:
a. No, se puede emplear todo el tiempo que se requiera
b. Sí, la suma de los tiempos permitidos para cada uno de los niveles, que es 7.5 minutos
c. Sí, el tiempo permitido para el nivel más complejo, que es 3.5 minutos
d. Ninguna de las otras opciones es correcta

-6/7-
Instrucciones:
– Para seleccionar una respuesta : marcarla 
– Para borrar una respuesta marcada : rodearla con un círculo  

Respuesta
Pregunta
a b c d

1    
2    
3    
4    
5    
6    
7    
8    
9    
10    
11    
12    
13    
14    
15    
16    
17    
18    
19    
20    

-7/7-
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 22 DE SEPTIEMBRE DE 2015
EXAMEN DE MICROCONTROLADORES TIEMPO: 2 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA
c) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
d) NO OLVIDE JUSTIFICAR TODAS SUS RESPUESTAS

DATOS: CONSTANTES DEL FICHERO DE CABECERA “msp430g2533.h”:


 #define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/set */
 #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */
 #define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up */
 #define TACLR (0x0004u) /* Timer A counter clear */
 #define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */
 #define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */

Se desea implementar un módulo de marcación multifrecuencia de dos tonos para un teléfono, mediante un
microcontrolador MSP430G2533. Para ello se dispone del siguiente esquema hardware.

Los tonos que permiten diferenciar las pulsaciones de los doce botones del teléfono (‘0’-‘9’, más ‘*’ y ‘#’)
se generan mediante señales PWM de distinta frecuencia, que se dirigen a un filtro que los combina antes de
enviarlos a la línea telefónica y al teléfono. Cada fila de botones se corresponde con una frecuencia distinta.
Igualmente, cada columna de botones se corresponde con otra frecuencia. La pulsación de una tecla genera
por tanto dos frecuencias, correspondientes a la fila y a la columna de cada botón.
Cada botón del teléfono es un pulsador conectado como en la figura, que muestra el
ejemplo del 3, conectado a los terminales de la fila y la columna que le
corresponden.
A continuación se muestra el código implementado en el microcontrolador:

1
#include "msp430g2533.h" void Config_Perifericos(void) {
P1DIR = 0x00;
/* === TIPOS DATOS =============================== */ P1REN = 0x7F;
P1OUT = 0x00;
typedef union {
unsigned char total; P1IES = 0x00;
struct { P1IFG = 0x00;
unsigned char play_tonos: 1; P1IE = 0x7F;
unsigned char apagar_tonos: 1;
}; P2DIR |= BIT1+BIT6;
} Tareas; P2SEL |= BIT1+BIT6;
TA0CCTL1 = OUTMOD_7;
/* === VARIABLES GLOBALES ======================== */ TA1CCTL1 = OUTMOD_7;
TA0CTL = TASSEL_2 + TACLR;
Tareas tareas; TA1CTL = TASSEL_2 + TACLR;
} // void Config_Perifericos(void)
int tonosfilas[4] = {0xXX,0xXX,0xXX,0xXX}; // Preg. 2
int tonoscolumnas[3] = {0xXX,0xXX,0xXX}; // Preg. 2 unsigned char Contar(unsigned char valor) {
unsigned char col = 0, fil = 0; unsigned char contador = 0;

/* === PROTOTIPOS ================================ */ while (valor > 0) {

void Config_uC(void); if ((valor & 1) == 1) {


void Config_Perifericos(); contador++;
unsigned char Contar(unsigned char valor); } // if ((valor & 1) == 1)
unsigned char Pos(unsigned char valor);
valor = valor >> 1;
/* === PROGRAMA PRINCIPAL ======================== */ } // while (valor > 0)

int main(void) { return contador;


Config_uC(); } // unsigned char Contar(unsigned char)
Config_Perifericos();
tareas.total = 0; unsigned char Pos(unsigned char valor) {
for (;;) { unsigned char posicion = 0;

__low_power_mode_0(); while ((valor & 1) == 0) {


posicion++;
while (tareas.total) { valor = valor >> 1;
if (tareas.play_tonos) { } // while ((valor & 1) == 0)
tareas.play_tonos = 0;
TA0CCR1 = tonosfilas[Pos(fil)]; return posicion;
TA0CCR0 = (TA0CCR1 * 2) - 1; }
TA1CCR1 = tonoscolumnas[Pos(col)];
TA1CCR0 = (TA1CCR1 * 2) - 1; /* === RUTINAS TRATAMIENTO INTERRUPCION ========== */
TA0CTL |= MC_1;
TA1CTL |= MC_1; #pragma vector = WDT_VECTOR
} // if (tareas.play_tonos) __interrupt void RTI_WD(void) {
WDTCTL = WDTPW + WDTHOLD;
else if(tareas.apagar_tonos) { P1IFG = 0x00;
tareas.apagar_tonos = 0; P1IE = 0x7F;
TA1CCR0 = TA0CCR0 = 0; col = P1IN & 0x07;
TA1CCR1 = TA0CCR1 = 0; fil = (P1IN >> 3) & 0x0F;
TA0CTL &= ~(MC_1);
TA1CTL &= ~(MC_1); if ((Contar(col)==1) && (Contar(fil)==1)) {
} // else: if (tareas.play_tonos) tareas.play_tonos = 1;
__low_power_mode_off_on_exit();
} // while (tareas.total) } // ((Contar(col)==1) && (Contar(fil)==1))

} // for (;;) else if ((Contar(col)==0) && (Contar(fil)==0)) {


tareas.apagar_tonos = 1;
} // int main(void) __low_power_mode_off_on_exit();
} // else if ((Contar(col)==0) && ...
/* === FUNCIONES ================================= */ } // __interrupt void RTI_WD(void)

void Config_uC(void) { #pragma vector = PORT1_VECTOR


WDTCTL = WDTPW + WDTHOLD; __interrupt void RTI_P1(void) {
IE1 = WDTIE; P1IE = 0x00;
DCOCTL = 0; WDTCTL = WDT_MDLY_32;
BCSCTL1 = CALBC1_1MHZ; P1IES ^= P1IFG;
DCOCTL = CALDCO_1MHZ; } // __interrupt void RTI_P1(void)
} // void Config_uC(void)

2
NOTA: En C el operador “>>” realiza un desplazamiento binario a la derecha. Su sintaxis es “var >> N”,
e indica que la variable “var” se desplaza “N” bits a la derecha. Así por ejemplo, si la variable “var”
tiene el valor “01101001” y “N” tiene el valor “2” la operación que se realiza es:

Teniendo en cuenta el código anterior, conteste de forma justificada a las siguientes preguntas.
1. Explique en detalle cuál es la configuración inicial (justo tras la llamada a Config_Perifericos())
de los dos temporizadores TA0 y TA1. (1 punto)
Ambos temporizadores tienen idéntica configuración. Inicialmente se
encuentran en modo de comparación. La configuración de función especial
de los terminales P2.6 y P2.1 (P2DIR |= BIT1+BIT6; P2SEL |= BIT1+BIT6;)
nos indica que ambos temporizadores se encuentran preparados para
generar las dos señales PWM a partir de los bloques TA0CCR1 y TA1CCR1.
La configuración TA0CCTL1 = OUTMOD_7 y TA1CCTL1 = OUTMOD7 los deja en
modo de salida Reset/Set. En ambos casos, inicialmente la salida está a
cero, puesto que tras el RESET los bits OUT de TA0CCTL1 y TA1CCTL1 están
a cero. Ambos temporizadores están inicialmente parados, pero preparados
para funcionar a la frecuencia de 1MHz, puesto que están conectados a la
señal SMCLK (TA0CTL = TASSEL_2 + TACLR; TA1CTL = TASSEL_2 + TACLR;), que
la función Config_uC ha dejado configurado a esta frecuencia.
2. Las frecuencias de los tonos que debe generar el módulo son las que indica la siguiente tabla.

1209 Hz 1336 Hz 1447 Hz

697 Hz 1 2 3

770 Hz 4 5 6

852 Hz 7 8 9

941 Hz * 0 #

Teniendo en cuenta la configuración de los temporizadores TA0 y TA1, indique todos los valores con los
que se han de inicializar los arrays int tonosfilas[4] e int tonoscolumnas[3]. Describa en
detalle el ejemplo del 3. (2 puntos)
Por un lado, recordamos que la configuración del reloj realizada en
Config_uC proporciona una señal interna SMCLK de fSMCLK=1MHz, y que la
configuración de los temporizadores los deja preparados para generar
señales PWM en modo de salida Reset/Set. Por otro lado, vemos en el
programa principal (en la tarea “play_tonos”) que, para generar las

3
señales PWM, se configura el temporizador en modo UP (TA0CTL = MC_1;
TA1CTL = MC_1). Por
último, observamos también que, en el programa principal, los valores
de los arrays tonosfilas y tonoscolumnas se utilizan directamente para
rellenar los valores de los registros de captura/comparación TA0CCR1
(filas) y TA1CCR1 (columnas), y, multiplicados por dos, para rellenar
los valores de TA0CCR0 (filas) y TA1CCR0 (columnas). Por tanto, con esta
configuración, modo UP y configuración RESET/SET, tenemos sendas señales
cuadradas con ciclo de trabajo del 50% y frecuencias FFILAS = FSMCLK
/(TA0CCR0 + 1) y FCOLUMNAS = fSMCLK /(TA1CCR0 + 1), o despejando el valor de
TA0CCR0 y TA1CCR0:
TA0CCR0 = FSMCLK/FFILAS - 1 y TA1CCR0 = FSMCLK/FCOLUMNAS – 1
Por tanto, como TAxCCR0 = 2*TAxCCR1 – 1, resulta:
TA0CCR1 = FSMCLK/(2*FFILAS) y TA1CCR1 = FSMCLK/(2*FCOLUMNAS)
En el caso que se nos pide detallar como ejemplo, el del botón 3, el
módulo debe generar dos frecuencias: 697 Hz para la fila y 1447 Hz para
la columna, resultando
TA0CCR1 = 1x106/(2*697) ≈ 717 y TA1CCR1 = 1x106/(2*1447) ≈ 346
Los arrays completos de valores resultan ser (tras redondear):
int tonosfilas[4] = {717, 649, 587, 531};
int tonoscolumnas[3] = {414, 374, 346};
O, en hexadecimal:
int tonosfilas[4] = {0x02CD, 0x0289, 0x024B, 0x0213};
int tonoscolumnas[3] = {0x19E, 0x0176, 0x015A};

3. Suponga que se pulsan dos botones exactamente a la vez. Por ejemplo, el 1 y el 2. Explique en detalle
qué es lo que sucede. (1,5 puntos)
Inicialmente el microcontrolador está en modo de bajo consumo LPM0. Si
se pulsan dos botones a la vez, la rutina de tratamiento de
interrupción, RTI_P1, configurará la RTI del watchdog e invertirá los
flancos a detectar en ambos terminales (P1IES ^= P1IFG). En la RTI del
watchdog, se borrarán ambos flags de P1IFG y se decodifican las filas y
las columnas que corresponden a los botones que siguen pulsados,
mediante la lectura del registro P1IN. Si se pulsan el 1 y el 2,
tendremos que P1IN toma el valor 00001011, y por tanto la variable fil
toma el valor 00000001, y la variable col toma el valor 00000011. La
expresión if ((Contar(fil)==1) && (Contar(col) == 1)) sería falsa,
puesto que Contar(col) daría un valor de 2. Por tanto no se entra en el
bloque if que deja en modo activo al microcontrolador y tras el retorno
de la RTI del watchdog el microcontrolador vuelve a su estado de bajo
consumo.

4
4. Suponga ahora que primero se pulsa el botón 1, pero no se suelta, durante un tiempo relativamente largo
(por ejemplo, un segundo). Antes de soltarlo, se pulsa el botón 2. A continuación se sueltan los dos botones
a la vez. Explique en detalle lo que sucede. ¿Por qué es necesaria la instrucción P1IES = 0x00 en la
función Config_Perifericos()? (1,5 puntos)
Inicialmente el microcontrolador está en modo de bajo consumo LPM0. Si
se pulsa el botón 1, la rutina de tratamiento de interrupción, RTI_P1,
configurará la RTI del watchdog. En la RTI del watchdog, se borrará el
flag de P1IFG y tendremos que la variable fil toma el valor 00000001, y
la variable col toma el valor 0000001 también. La expresión if
((Contar(fil)==1) && (Contar(col) == 1)) sería ahora verdadera, y a
continuación se activa la tarea tarea.play_tonos y se deja a la CPU en
modo activo tras la interrupción. En el programa principal, en la tarea
tarea.play_tonos, se generan los dos tonos de 697Hz y 1209Hz. Mientras
el botón no se suelte, los tonos siguen generándose. Si transcurrido un
tiempo se pulsa un segundo botón, el proceso anteriormente descrito se
repite hasta que, al igual que el ejercicio anterior, la comprobación
Contar(col) nuevamente da un valor igual a 2, con lo cual la rutina del
watchdog deja a la CPU en el estado de bajo consumo LPM0. Los tonos del
1 siguen generándose. Al soltar los botones, los flancos de bajada
generados dispararían la rutina RTI_P1 y consiguientemente RTI_WDT. Esta
vez la comprobación ((Contar(col) == 0) && (Contar(fil) == 0)) sería
verdadera, entrándose en el bloque if que programa la tarea
tarea.apagar_tonos y deja a la CPU en modo activo en el programa
principal. En la tarea tarea.apagar_tonos se detiene la generación de
señales PWM. Por su parte, la instrucción P1IES = 0x00 configura los
pulsadores para que se detecte la primera pulsación mediante el
correspondiente flanco de subida.

5. Suponga que se quiere ampliar la funcionalidad del sistema


sustituyendo el teclado actual por otro teclado avanzado con otra
columna de botones (teclas ‘A’-‘D’) como el de la figura.

5
Realice la conexión del nuevo teclado avanzado en el sistema,
sustituyendo el teclado actual. (1 punto)

Existen múltiples terminales que pueden usarse


para conectar esta nueva columna de botones,
entre los cuales se encuentra la que se
presenta aquí, que utiliza únicamente el Puerto
1, al que todavía le sobra un terminal. Para
facilitar el código en los siguientes
ejercicios, desplazaremos además los puertos
utilizados para las filas, quedando así el
nuevo esquema:

6. Modifique, en coherencia con su respuesta a la pregunta anterior, la parte del programa que gestiona las
rutinas de tratamiento de interrupción para que puedan detectarse las pulsaciones de la nueva columna de
botones. (1 punto)
La RTI_WD necesitaría realizar los siguientes cambios:

Instrucción anterior Instrucción nueva

P1IE = 0x7F; P1IE = 0xFF;

col = P1IN & 0x07 col = P1IN & 0x0F

fil = (P1IN >> 3) & 0x0F; fil = (P1IN >> 4) & 0x0F;

La RTI_P1 no necesitaría realizar ningún cambio.

7. Modifique, en coherencia con sus respuestas a las preguntas 5 y 6, el resto del programa (programa
principal, variables globales y funciones auxiliares) para que puedan detectarse las pulsaciones de la nueva
columna de botones. Necesariamente las nuevas variables globales incluirán un nuevo array int
tonoscolumnas[4] . (1 punto)

Instrucción anterior Instrucción nueva

int tonoscolumnas[3] = {xx,xx,xx}; int tonoscolumnas[4] = {xx,xx,xx,xx};

Y en la función Config_Perifericos():
P1REN = 0x7F P1REN = 0xFF

P1IE = 0x7F P1IE = 0xFF

No sería necesario realizar ningún otro cambio en el programa principal,


ni en las variables globales ni en las funciones auxiliares.

6
8. Si la nueva frecuencia correspondiente a esta columna es de 1633 Hz, ¿cuál es el nuevo valor a introducir
en el array int tonoscolumnas[4]? (1 punto)
Realizando los mismos cálculos que ya se hicieron en el ejercicio anterior,
TA1CCR1 = FSMCLK/(2*FCOLUMNAS) = 1x106/(2*1633) ≈ 306
Y por tanto la nueva instrucción sería
int tonoscolumnas[4] = {414, 374, 346, 306};
O, en hexadecimal:
int tonoscolumnas[4] = {0x19E, 0x0176, 0x015A, 0x0132};

7
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 28 DE JUNIO DE 2013
EXAMEN DE MICROCONTROLADORES TIEMPO: 2 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
c) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA

DATOS: CONSTANTES DEL FICHERO DE CABECERA “io430g2533.h”:


 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
 #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */
 #define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */
 #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */
 #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */
 #define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */
 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0) CC1, CC2, TA0 */
 #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */
 #define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */

DESCRIPCIÓN SISTEMA MORSE


A continuación se presenta una implementación de un sistema de transmisión de código MORSE basado en
el microcontrolador MSP430G2533. El código MORSE está compuesto únicamente por dos símbolos
(Punto y Raya). Los distintos caracteres del alfabeto MORSE se forman con diferentes combinaciones de los
símbolos punto y raya, manteniendo una determinada temporización en la generación de los símbolos.
Las especificaciones que se siguieron a la hora de implementar el sistema son las siguientes:
 El símbolo punto puede tener cualquier duración temporal, utilizándose esta duración como la unidad
de referencia temporal para el resto del código.
 El símbolo raya tiene una duración temporal referenciada y mayor que el punto.
 Entre los distintos símbolos de un mismo carácter debe existir una separación temporal cuya
duración debe estar referenciada al punto. A esta separación temporal se le denomina tiempo de
pausa entre símbolos (TPS)
 Entre los distintos caracteres de una misma palabra existe una separación temporal cuya duración
también se referencia al punto pero que debe ser mayor que la separación entre símbolos. A esta
separación temporal se le denomina tiempo de pausa entre caracteres (TPC)
 Entre las palabras que componen un mensaje también existe una separación temporal referenciada al
punto y de mayor duración que la separación entre símbolos y caracteres. A esta separación se le
denomina tiempo de pausa entre palabras (TPP)
 Por último, si se desea indicar el fin de transmisión de un mensaje existe una separación temporal
referenciada al punto y de mayor duración que las anteriores. A esta separación temporal se le
denomina tiempo de fin de transmisión (TFT)

-1/9-
A continuación se muestra el código correspondiente al sistema:
#include "io430g2533.h" }//else if(caracter_error)
/* ====== CONSTANTES ============================= */ indiceS_C++;
#define ON 1 indiceS_S=0;
#define OFF 0 if (tipo_pausa==TPP){
#define LED_ON 1 sec_car[indiceS_C++]=' ';
#define LED_OFF 0 }//if (tipo_pausa==TPP)
#define UdT 1024 if (tipo_pausa==TFT){
#define T_LED 256 sec_car[indiceS_C++]='$';
#define TPS 0 indiceS_C=0;
#define TPC 1 }//if (tipo_pausa==TPP)
#define TPP 2 }//if(tipo_pausa != TPS)
#define TFT 3 } // if (tareas.f1 == ON)
#define TAM_SEC_SIMB 5 } // while (tareas.total != OFF)
#define TAM_CAR 40 } // for (;;)
} // int main(void)
/* ====== TIPOS DATOS ============================ */
typedef union { /* ====== FUNCIONES ============================= */
unsigned volatile char total; void Config_uC(void) {
struct { WDTCTL = WDTPW + WDTHOLD;
unsigned char f0 :1; DCOCTL = 0;
unsigned char f1 :1; BCSCTL1 = CALBC1_1MHZ;
}; DCOCTL = CALDCO_1MHZ;
} flags; P2DIR = BIT7;
P2SEL = BIT7 + BIT6;
/* ====== VARIABLES GLOBALES ===================== */ } // void Config_uC(void)
flags tareas;
unsigned char tiempo_raya, simbolo, tipo_pausa, void Config_Perifericos(void) {
caracter_error, sec_simb[TAM_SEC_SIMB+1], indiceS_S, P1DIR_bit.P0 = P1DIR_bit.P6 = ON;
sec_car[TAM_CAR], indiceS_C; P1OUT_bit.P0 = P1OUT_bit.P6 =LED_OFF;
P1DIR_bit.P3 = OFF;
/* ====== PROTOTIPOS ============================= */ P1REN_bit.P3 = P1OUT_bit.P3=P1IES_bit.P3=ON;
void Config_uC(void); P1IFG_bit.P3 = OFF;
void Config_Perifericos(); P1IE_bit.P3 = ON;
unsigned char D_morse(unsigned char *); TA0CTL = TASSEL_1 | ID_3 | MC_2 | TACLR;
} // void Config_Perifericos(void)
/* ====== PROGRAMA PRINCIPAL ===================== */
unsigned char D_morse(unsigned char *secuencia) {
int main(void) { const static unsigned char caracteres[] =
Config_uC(); "#ETIANMSURWDKGOHVF#L#PJBXCYZQ##54#3###2#######16#
Config_Perifericos(); ######7###8#90";
unsigned char caracter;
tareas.total = 0; unsigned char posicion = 0;
tipo_pausa= TPS; unsigned char cont_aux = 0;
caracter_error=OFF; while (secuencia[cont_aux] != '\0') {
indiceS_S=0; if (secuencia[cont_aux] == '.') {
indiceS_C=0; posicion = (2*posicion)+1;
} // if (secuencia[cont_aux] == '.')
__enable_interrupt(); else if (secuencia[cont_aux] == '-') {
for (;;) { posicion = (2*posicion)+2;
__low_power_mode_0(); } // else if (secuencia[cont_aux] == '-')
while (tareas.total) { cont_aux++;
if (tareas.f0==ON) { }// while (secuencia[cont_aux] != '\0')
tareas.f0 = OFF; caracter = caracteres[posicion];
//pregunta 5 return(caracter);
if (indiceS_S < (TAM_SEC_SIMB)){ } // unsigned char D_morse(unsigned char *secuencia)
sec_simb[indiceS_S]=simbolo;
indiceS_S++; /* ====== RUTINAS TRATAMIENTO INTERRUPCION ====== */
sec_simb[indiceS_S]='\0';
}//if (indiceS_S< TAM_SEC_SIMB) #pragma vector = TIMER0_A0_VECTOR
else{ __interrupt void RTI_T0_TACCR0(void) {
caracter_error=ON; P1OUT_bit.P0 = P1OUT_bit.P6 = LED_OFF;
}//else if(indiceS_S < (TAM_SEC_SIMB)) TA0CCTL0_bit.CCIE = OFF;
if(simbolo=='.') { } // __interrupt void RTI_T0_TACCR0(void)
P1OUT_bit.P0 = LED_ON;
}// if(simbolo=='.') #pragma vector = TIMER0_A1_VECTOR
if(simbolo=='-'){ __interrupt void RTI_T0_TACCR12(void) {
P1OUT_bit.P6 = LED_ON; switch (__even_in_range(TA0IV, 10)) {
}// if(simbolo=='-') case (2): {
TA0CCR0 = TA0R + T_LED; tiempo_raya=ON;
TA0CCTL0_bit.CCIFG = OFF; TA0CCTL1_bit.CCIE = OFF;
TA0CCTL0_bit.CCIE = ON; simbolo = '-';
} // if (tareas.f0 == ON) tareas.f0 = ON;
if (tareas.f1 == ON) { break;
tareas.f1 = OFF; } // case (2)
if(tipo_pausa!=TPS){ case (4): {
if(caracter_error){ tipo_pausa++;
sec_car[indiceS_C]='@'; switch (tipo_pausa){
caracter_error=OFF; case(TPC): {
}//if(caracter_error) TA0CCR2 = TA0CCR2 + (4* UdT);
else{ break;
sec_car[indiceS_C]=D_morse(sec_simb); } //case(TPC)
case(TPP): {
-2/9-
TA0CCR2 = TA0CCR2 + (7* UdT); //Flanco de bajada (pulsador presionado)
break; tiempo_raya=OFF;
} //case(TPP) TA0CCR1 = TA0R + (3* UdT);
case(TFT): { TA0CCTL1_bit.CCIFG = OFF;
TA0CCTL2_bit.CCIE = OFF; TA0CCTL1_bit.CCIE = ON;
TA0CCTL2_bit.CCIFG = OFF;
tareas.f1=ON; TA0CCTL2_bit.CCIE = OFF;
break; TA0CCTL2_bit.CCIFG = OFF;
} //case(TFT) if(tipo_pausa!=TFT){
}// switch (tipo_pausa) tareas.f1=ON;
break; }// if(tipo_pausa!=TFT)
} // case (4) } // if (P1IES_bit.P3 == ON)
} // switch (__even_in_range(TA0IV, 10)) else {
if (tareas.total != OFF) { //Flanco de subida (pulsador soltado)
__low_power_mode_off_on_exit(); if (tiempo_raya== OFF) {
} // if (tareas.total != OFF) simbolo='.';
} // __interrupt void RTI_T0_TACCR12(void) TA0CCTL1_bit.CCIE = OFF;
tareas.f0=ON;
#pragma vector = WDT_VECTOR }//if (tiempo_raya== OFF)
__interrupt void RTI_WD(void) { tipo_pausa=TPS;
WDTCTL = WDTPW + WDTHOLD; TA0CCR2 = TA0R + (3* UdT);
P1IFG_bit.P3 = OFF; TA0CCTL2_bit.CCIFG = OFF;
P1IE_bit.P3 = ON; TA0CCTL2_bit.CCIE = ON;
} // __interrupt void RTI_WD(void) } // else if (P1IES_bit.P3 == ON)
P1IES_bit.P3 = ~(P1IES_bit.P3);
#pragma vector = PORT1_VECTOR P1IFG_bit.P3 = OFF;
__interrupt void RTI_P1(void) { if (tareas.total != OFF) {
P1IE_bit.P3 = OFF; __low_power_mode_off_on_exit();
WDTCTL = WDT_MDLY_32; } // if (tareas.total != OFF)
IFG1_bit.WDTIFG=OFF; } // void RTI_P1(void)
IE1_bit.WDTIE = ON;
if (P1IES_bit.P3 == ON) {

La figura1 muestra la conexión al microcontrolador MSP430G2533 de los elementos de los que dispone el
sistema MORSE (un pulsador para la introducción de los símbolos , dos LEDS asociados a los símbolos
punto y raya y un cristal de 32768Hz).

ROJO 

VERDE

Figura 1. Esquema del sistema

Teniendo en cuenta el código anterior y el esquema del sistema, conteste de forma justificada a cada una
de las preguntas que se plantean sobre la implementación del sistema MORSE.

-3/9-
LEDS (2,5p)
1. En el sistema existen dos LEDs conectados respectivamente a los terminales del puerto 1 P1.0 (LED
ROJO) y P1.6 (LED VERDE). Responda y justifique las siguientes preguntas según se ha
implementado en el código anterior.
a. ¿A qué símbolo está asociado el LED ROJO? (0,5p)
El LED ROJO está asociado al símbolo punto tal y como se ve en las siguientes instrucciones que 
se ejecutan en la tarea.f0 del programa principal.  
if(simbolo=='.')
P1OUT_bit.P0 = LED_ON;
}// if(simbolo=='.')

b. ¿Qué acción provoca el encendido del LED ROJO y en qué momento (exprese el momento en
términos de la constante UdT)? (0,5p)
El encendido del LED ROJO se produce cuando se suelta el pulsador asociado al terminal P1.3 y 
el tiempo que ha permanecido pulsado es menor que 3UdT.
c. ¿Qué acción provoca el encendido del LED VERDE y en qué momento (exprese el momento
en términos de la constante UdT)? (0,5p)
El  encendido  del  LED  VERDE  se  produce  cuando  se  tiene  presionado  el  pulsador  asociado  al 
terminal P1.3 un tiempo igual 3UdT. En 3UdT se produce el encendido del LED VERDE aunque no 
se haya soltado el pulsador. 
d. ¿Cuánto tiempo permanece encendido el LED ROJO? (0,5p)
Cuando el pulsador se suelta y ha estado presionado menos de 3 UdT se pasa a ejecutar la tarea 
f0 en la que se enciende el LED ROJO y se planifica una interrupción en T_LED ciclos del TA0CCR0 
del TA0. En la rutina de tratamiento de interrupción del TA0CCR0 se programa el apagado de 
los LEDS. Por lo tanto, el LED ROJO habrá permanecido encendido T_LED/fTA0= 62,5ms. 
JUSTIFICACIÓN 
El LED ROJO permanece encendido T_LED ciclos del TA0, gestionados a través de la interrupción 
en modo comparación del registro TA0CCR0. 
TA0 se programa en la rutina Config_Perifericos() a través de la siguiente instrucción  
TA0CTL = TASSEL_1 | ID_3 | MC_2 | TACLR;
La instrucción anterior programa a TA0 para que realice su cuenta con la fuente de reloj ACLK, 
modo de división por 8 y modo continuo. 
Por lo tanto, la frecuencia de cuenta del TA0 es: fTA0= 32768/8=4096 Hz 
En  la  tarea  f0,  con  las  instrucciones  que  hay  más  abajo,  se  programa  una  interrupción  del 
registro TA0CCR0 en T _LED ciclos, lo que se producirá en T_LED/fTA0= 62,5ms  
TA0CCR0 = TA0R + T_LED;
TA0CCTL0_bit.CCIFG = OFF;
TA0CCTL0_bit.CCIE = ON;
 
Dentro  de  la  rutina  de tratamiento  del  TA0CCR0  RTI_T0_TACCR0( ) se  apagan  los  LEDs, 
por lo que el LED ROJO habrá permanecido encendido 62,5ms 
-4/9-
e. ¿Cuánto tiempo permanece encendido el LED VERDE? (0,5p)
El LED VERDE se mantiene encendido el mismo tiempo que el LED ROJO62.5ms. 
Cuando  el  pulsador  permanece  presionado  3  UdT  se  pasa  a  ejecutar  la  tarea  f0  en  la  que  se 
enciende el LED VERDE y se planifica una interrupción en T_LED ciclos del TA0CCR0 del TA0. En 
la rutina de tratamiento de interrupción del TA0CCR0 se programa el apagado de los LEDS. Por 
lo tanto el LED VERDE habrá permanecido encendido T_LED/fTA0= 62,5ms. 

SIMBOLOS (2p)
2. En el sistema implementado se ha establecido una temporización para los símbolos punto y raya.
Responda a las siguientes preguntas teniendo en cuenta la implementación que se ha realizado en el
código anterior.
a. ¿Qué intervalo de tiempo de pulsación expresado en ms se considera un símbolo punto? (1p)
Cualquier pulsación menor que 3UdT. 
Al presionar el pulsador, en la rutina de interrupción  RTI_P1() se programa una interrupción 
del  registro  TA0CCR1  en  3UdT  y  se  pone  la  variable  de  estado  tiempo_raya= OFF  .  Si  se 
produce  la  interrupción  del  registro  TA0CCR1  antes  de  soltar  el  pulsador  en  la  rutina  de 
tratamiento de interrupción  RTI_T0_TACCR12( ), se pone  tiempo_raya= ON, lo que marca que 
el símbolo introducido es una raya. En caso contrario tiempo_raya permanece a OFF marcando 
que símbolo introducido es un punto. 
UdT=1024  ciclos  con  la  configuración  de  TA0,  que  justificó  en  la  pregunta  1.d,  UdT  tiene  una 
duración  temporal  de  250ms.  Por  lo  tanto  cualquier  pulsación  inferior  a  750ms  será 
considerado como un símbolo punto.
b. ¿Qué intervalo de tiempo de pulsación expresado en ms se considera un símbolo raya? (1p)
Cualquier pulsación mayor o igual que 3UdT. Cualquier pulsación mayor que 750ms 

PAUSAS (2,5p)
3. En el sistema implementado se han establecido cuatro tipos de pausas (TPS, TPC, TPP y TFT), las
cuales han sido definidas anteriormente en la descripción del MORSE. Responda a las siguientes
preguntas teniendo en cuenta su implementación en el código anterior.
a. ¿Qué intervalo de tiempo expresado en ms debe permanecer soltado el pulsador para que el
sistema asuma que se trata de una pausa entre símbolos TPS? (0,5p)
Las pausas se miden a través de las interrupciones programadas del registro TA0CCR2. Cuando 
se suelta el pulsador, lo que provoca la ejecución de la rutina de interrupción RTI_P1(), se 
programa  una  interrupción  de  TA0CCR2  en  3UdT  (750ms  tal  y  como  se  ha  calculado  en  las 
preguntas anteriores) y la variable tipo_pausa se inicializa al valor TPS. De esta forma, si no 
se  llega  a  producir  la  interrupción  de  TA0CCR2  cuando  se  vuelve  a  presionar  el  pulsador  se 
ejecuta la tarea f1( la tarea f1 identifica y trata los distintos tipos de pausas) con el valor TPS 
para la variable tipo_pausa. Por lo tanto cualquier valor de la pausa inferior a 750ms se 
considera TPS. 
Intervalo TPS t<750ms 

-5/9-
 
 

b. ¿Qué intervalo de tiempo expresado en ms debe permanecer soltado el pulsador para que el
sistema asuma que se trata de una pausa entre caracteres TPC? (0,5p)
Si tras programar la interrupción de TA0CCR2 en 3UdT, en la rutina de interrupción RTI_P1(),
la  interrupción  de  TA0CCR2  se  produce,  ocurre  lo  siguiente  en  la  rutina  de  tratamiento  de 
TA0CCR1 y TA0CCR2 RTI_T0_TACCR12(), en la parte correspondiente al TA0CCR2: 
i) la variable tipo_pausa se incrementa, pasando su valor a TPC.  
ii) se programa una nueva interrupción de TA0CCR2 en 4UdT adicionales.  
Si  esta  nueva  interrupción  planificada  en  4UdT  adicionales  se  llega  a  producir,  provocaría  el 
incremento  la  variable  tipo_pausa,  pasando  a  valer  TPP  y  programando  una  nueva 
interrupción en 7UdT adicionales.  
Por lo tanto, se puede indicar que cualquier pausa mayor que 3UdT (750ms) pero menor que 
7UdT (3UdT+4UdT) (1750ms) se considera una pausa entre caracteres. 
Intervalo TPC1750ms>t≥750ms 

c. ¿Qué intervalo de tiempo expresado en ms debe permanecer soltado el pulsador para que el
sistema asuma que se trata de una pausa entre palabras TPP? (0,5p)
Cuando  la  variable  tipo_pausa  pasa  a  valer  TPP  se  programa  otra  interrupción  en  7UdT 
adicionales,  si  esta  interrupción  planificada  se produce,  entonces  modifica  la  variable  al  valor 
TFT.  Por  lo  tanto,  cualquier  pulsación  mayor  que  7UdT  (1750ms)  pero  menor  que  14  UdT 
(7UdT+7UdT) (3500ms) se considerará una pausa entre palabras. 
Intervalo TPP3500ms>t≥1750ms

d. ¿Qué intervalo de tiempo expresado en ms debe permanecer soltado el pulsador para que el
sistema asuma que se trata de una pausa que indica el final de transmisión de un mensaje
TFT? (0,5p)
Cualquier valor mayor que 14UdT 3500ms 
Intervalo TFT t≥3500ms

e. ¿Cómo se almacenan en el array sec_car los diferentes tipos de pausa? (0,5p)


En la tarea f1 se identifican y tratan los distintos tipos de pausa  
TPS no se almacena 
TPC no se almacena 
TPP se almacena el carácter espacio ‘ ‘ 
TFT se almacena el carácter dólar ‘$’ 
-6/9-
ERRORES (1,5p)
4. En el sistema se han implementado dos tipos de errores de carácter relacionados con la transmisión del
MORSE.
Tipo 1: cuando la secuencia de símbolos introducida no se corresponde con ningún carácter del alfabeto
MORSE.
Tipo 2: cuando se introducen más símbolos consecutivos que el número máximo de símbolos que tiene
un carácter del alfabeto MORSE que se ha implementado.
Responda a las siguientes preguntas según se ha implementado en el código anterior.
a. ¿Con qué tipo de error está relacionada la variable caracter_error? ¿Bajo qué condición
esta variable se pone a ON?(0,5p)
Con  el  tipo2.  La  variable  caracter_error se  pone  a  ON  si  se  introduce  cualquier  carácter 
que tenga más de 5 símbolos. 
if (indiceS_S < (TAM_SEC_SIMB)){
sec_simb[indiceS_S]=simbolo;
indiceS_S++;
sec_simb[indiceS_S]='\0';
}//if (indiceS_S< TAM_SEC_SIMB)
else{
caracter_error=ON;
}//else if(indiceS_S < (TAM_SEC_SIMB))
 
La  constante  TAM_SEC_SIMB tiene  un  valor  5,  por  lo  que  el  array  sec_simb  definido  como 
sec_simb[TAM_SEC_SIMB+ 1]  tiene  6  elementos:  sec_simb[0], sec_simb[1],
sec_simb[2], sec_simb[3], sec_simb[4], sec_simb[5].  

En  las  instrucciones  que  hay  más  arriba  se  programa,  que  en  el  caso  de  que  indiceS_S  
alcance el valor 5, la variable  caracter_error se pone a ON. Si  indiceS_S vale 5, significa 
que se ha alcanzado el último elemento del array para el que se ha hecho reserva de memoria, y 
que  en  la  anterior  ejecución  de  la  tarea  f0  se  había  inicializado  al  carácter  fin  de  cadena 
sec_simb[5]=’\0’, por lo tanto ya no hay más espacio para almacenar más símbolos y eso 
se indica con la variable caracter_error. 

b. ¿Cómo se representan los errores que activan la variable caracter_error en el array


sec_car? (0,5p)

En la tarea f1 se tratan tanto las pausas como los errores, cuando la pausa corresponde a una 
distinta  que  la  pausa  entre  símbolos  entonces  si  la  variable  caracter_error    está  a  ON 
entonces se almacena en el array sec_car el carácter arroba ‘@’ 

c. ¿Cuál es el tamaño máximo que puede alcanzar el array sec_simb? (0,5p)


6 que son los 5 símbolos del carácter MORSE más el fin de cadena ‘\0’ 

-7/9-
ERRORES DE PROGRAMACIÓN (1,5p)
5. En el sistema con el código implementado cuando se introduce la secuencia a que se muestran a
continuación
TPS TPS TPS TPS TPS TPS TPSTPP (secuencia a)
en el array sec_car se almacena los valores que se visualizan en la figura2, correspondiente a la ventana
watch 1 del entorno de desarrollo IAR.

Figura 2. Captura de la ventana watch 1 cuando se introduce la secuencia a con el código sin modificar

Si se realiza el cambio que se muestra a continuación en la sentencia que está marcada en el programa
principal con el comentario // pregunta 5:
Sentencia original if (indiceS_S < (TAM_SEC_SIMB)){

Sentencia modificada if (indiceS_S < (TAM_SEC_SIMB+1)){

y se introduce la secuencia a, en esta ocasión se obtiene un resultado distinto e incorrecto ya que el cambio
provoca un error. El resultado obtenido cuando se introduce la secuencia a con el código modificado se
visualiza en la figura 3

Figura 3. Captura de la ventana watch 1 cuando se ha introducido la secuencia a con el código modificado

Observando las ventanas watch 1 (figuras 2 y 3), las variables involucradas y el código, explique cuál es la
causa del error (1,5p)
 
if (indiceS_S < (TAM_SEC_SIMB+1)){
sec_simb[indiceS_S]=simbolo;
indiceS_S++;
sec_simb[indiceS_S]='\0';
}//if (indiceS_S< TAM_SEC_SIMB)
else{
caracter_error=ON;
}//else if(indiceS_S < (TAM_SEC_SIMB))
 
Al  cambiar  el  código, se  permite  introducir  en  el  array  sec_simb  7  elementos,  cuando  la 
reserva  del  array  ha  sido  de  6.  En  las  figuras  2  y  3  se  ve  como,  sec_simb  tiene  reservada 
memoria  RAM  para  6  elementos  en  el  rango  de  direcciones  0x205  a  0x20A  y  la  variable 
indiceS_S  tiene  asignada  la  dirección  0x20B.  Con  esta  asignación,    la  introducción  de  un 
elemento más en el array provoca que se acceda a una zona de memoria reservada para otra 

-8/9-
variable, y se modifique su valor, pudiendo llevar al programa a un funcionamiento incorrecto. 
En este caso la variable afectada es indiceS_S.
Explicación de la situación que se genera al introducir la secuencia a 
Con el código modificado, al introducir la secuencia a permite que cuando indiceS_S vale 5 se 
realice las siguientes acciones: 
i) con la instrucción  sec_simb[indiceS_S]=simbolo; se almacena el sexto punto de la 
secuencia a en la posición de memoria 0x20A, correspondiente al elemento sec_simb[5]
ii) con la instrucción  indiceS_S++; se incrementa en una unidad la variable  indiceS_S , 
pasando a valer 6 
iii) con  la  instrucción  sec_simb[indiceS_S]='\0';se  almacene  el  carácter  de  fin  de 
cadena  en  una  posición  no  reservada  por  el  compilador  para  el  array  sec_simb[6],
correspondiente a la dirección de memoria RAM 0x20B. La dirección 0x20B es la posición de 
memoria  que  el  compilador  había  reservado  para  la  variable  indiceS_S  por  lo  que  al 
realizar la instrucción machaca el valor la variable con el valor del carácter fin de cadena que 
es 0. Esto provoca la variable indiceS_S se inicialice a 0. 
En este momento, cuando se introduce el séptimo punto de la secuencia a lo hace en la posición 
del array  sec_simb[0] ya que la variable  indiceS_S vale 0. El octavo punto lo introduce en 
la  posición  del  array  sec_simb[1],  con  lo  que  al  producirse  la  pausa  entre  palabras  TPP  la 
secuencia a se trata como si sólo tuviera dos puntos y se decodificará como un carácter ‘I’ (..), lo 
que es un comportamiento no deseado de la implementación.  

-9/9-
UNIVERSIDAD DE MÁLAGA ETSI TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 29 DE JUNIO DE 2012
EXAMEN DE MICROCONTROLADORES TIEMPO: 3 HORAS

APELLIDOS, NOMBRE: ______________________________________________ D.N.I.: _____________

TITULACIÓN: __________________________________________________________________________

INSTRUCCIONES:
a) LEA ATENTAMENTE EL ENUNCIADO Y LAS PREGUNTAS DEL EXAMEN
b) RESPONDA JUSTIFICADAMENTE CADA PREGUNTA EN EL ESPACIO RESERVADO PARA ELLO (NO SE
CONSIDERARÁ VÁLIDA NINGUNA RESPUESTA NO JUSTIFICADA)
c) ES NECESARIO OBTENER UN MÍNIMO DE 3 PUNTOS (SOBRE 10) PARA SUPERAR EL EXAMEN
d) LA CALIFICACIÓN DEL EXAMEN CONSITITUYE EL 60% DE LA CALIFICACIÓN FINAL DE LA
ASIGNATURA

DATOS:
a) CONSTANTES DEL FICHERO DE CABECERA “io430g2533.h”:
− #define DIVA_2 (0x20) /* ACLK Divider 2: /4 */
− #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */
− #define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to CCR0 */
− #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continuous up */
− #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */
− #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */
− #define OUTMOD_4 (4*0x20u) /* PWM output mode: 4 - toggle */
− #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
− #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0_A CC1, CC2, TA0 */
− #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */

Se desea diseñar el control de un semáforo de calle que emita una señal sonora para invidentes basándonos
en un sistema digital desarrollado con el microcontrolador MSP430G2533. En la figura 1 se muestra parte
del esquema del sistema de control.

Figura 1. Esquema del sistema de control para un semáforo.

-1/6-
A continuación se muestra el código correspondiente al sistema de control:

#include "io430g2533.h” break;


} // case 0
/* ====== CONSTANTES ============================= */ } // switch(idx)
} // if (tareas.f0)
#define ON 1 if (tareas.f1) {
#define OFF 0 tareas.f1 = OFF;
#define HURRY 0x1200 if((TA0CCR0 - TA0R) > 0x4FFF) {
TA0CCR0 = TA0R + 0x4FFF;
/* ====== TIPOS DATOS ============================ */ } // if((TA0CCR0 - TA0R) > 0x4FFF)
} // if (tareas.f1)
typedef union { } // while (tareas.total)
unsigned volatile char total; } // for (;;)
struct { } // int main(void)
unsigned char f0 :1;
unsigned char f1 :1; /* ====== FUNCIONES ============================= */
unsigned char f2 :1;
unsigned char f3 :1; void Config_uC(void) {
unsigned char f4 :1; WDTCTL = WDTPW + WDTHOLD;
unsigned char f5 :1; DCOCTL = 0;
unsigned char f6 :1; BCSCTL1 = CALBC1_1MHZ + DIVA_2;
unsigned char f7 :1; DCOCTL = CALDCO_1MHZ;
}; P2DIR_bit.P6 = 0;
} flags; P2DIR_bit.P7 = 1;
P2SEL_bit.P6 = P2SEL_bit.P7 = 1;
/* ====== VARIABLES GLOBALES ===================== */ } // void Config_uC(void)

flags tareas; void Config_Puertos(void) {


unsigned short int idx = 0; (Pregunta 2)
unsigned int semt[3] = {0xEC22,0x800,0x8C14}; } // void Config_Puertos(void)
unsigned int tmod;
void Config_TA0(void) {
/* ====== PROTOTIPOS ============================= */ TA0CTL = TASSEL_1|MC_2|ID_3|TACLR;
TA0CCTL0_bit.CCIFG = OFF;
void Config_uC(void); TA0CCTL0_bit.CCIE = ON;
void Config_Puertos(void); TA0CCR0 = TA0R + semt[0];
void Config_TA1(void); }// void Config_TA0(void)
void Config_TA0(void);
void Config_TA1(void) {
/* ====== PROGRAMA PRINCIPAL ===================== */ TA1CTL = TASSEL_1|MC_1|ID_0|TACLR;
TA1CCTL0 = OUTMOD_4;
int main(void) { } // void Config_TA1(void)
Config_uC();
Config_Puertos(); /* ====== RUTINAS TRATAMIENTO INTERRUPCION ====== */
Config_TA0();
Config_TA1(); #pragma vector = PORT1_VECTOR
__interrupt void RTI_Port1(void) {
for (;;) { P1IFG_bit.P3 = OFF;
__low_power_mode_1(); P1IE_bit.P3 = OFF;
while (tareas.total) { tareas.f1 = ON;
if (tareas.f0) { __low_power_mode_off_on_exit();
tareas.f0 = OFF; } // void RTI_Port1(void)
P2OUT = P2OUT >> 1;
idx = idx + 1; #pragma vector = TIMER0_A0_VECTOR
if(idx == 3){ __interrupt void RTI_TA0_CCR0(void) {
idx = 0; tareas.f0 = ON;
P2OUT = BIT2; __low_power_mode_off_on_exit();
} } // void RTI_TA0_CCR0(void)
TA0CCR0 = TA0R + semt[idx];
switch(idx){ #pragma vector = TIMER0_A1_VECTOR
case 1: { __interrupt void RTI_TA0_CCR12(void) {
P1IE_bit.P3 = OFF; switch(__even_in_range(TA0IV,10)){
break; case 2: {
} // case 1 if (TA1CCR0 == 7) {
case 2: { TA1CCR0 = 14;
tmod = 0x400; } // if (TA1CCR0 == 7)
TA1CCR0 = 7; else {
TA0CCR2 = TA0R + semt[idx] - HURRY; TA1CCR0 = 7;
TA0CCTL2 = CCIE; } // else - if (TA1CCR0 == 7)
TA0CCR1 = TA0R + tmod; break;
TA0CCTL1 = CCIE; } // case 2
break; case 4: {
} // case 2 tmod = 0x200;
case 0: { break;
P1IFG_bit.P3 = OFF; } // case 2
P1IE_bit.P3 = ON; } // switch(__even_in_range(TA0IV,10))
TA1CCR0 = 0; TA0CCR1 = TA0R + tmod;
TA0CCTL1 = 0; } // void RTI_TA0_CCR12(void)
TA0CCTL2 = 0;

-2/6-
1. Indique qué elementos del módulo de reloj se emplean en la aplicación y cómo están configurados
(función Config_uC()). [0.5 puntos]
La fuente de reloj del DCO se programa para generar una señal a 1 MHz introduciendo los valores de
calibración almacenados en la memoria Flash (CALBC1_1MHZ y CALDCO_1MHZ) en los registros
BCSCTL1 y DCOCTL. Esta fuente de reloj se utiliza para generar las señales de reloj MCLK y SMCLK:
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ + DIVA_2;
DCOCTL = CALDCO_1MHZ;
El cristal de cuarzo externo de 32768 Hz se utiliza como fuente de reloj de la señal de reloj ACLK,
configurando los pines P2.6 y P2.7 del microcontrolador con sus funcionalidades XIN y XOUT:
P2DIR_bit.P6 = 0;
P2DIR_bit.P7 = 1;
P2SEL_bit.P6 = P2SEL_bit.P7 = 1;
La señal de reloj ACLK se configura a 8192 Hz, dividiendo por 4 la fuente de reloj del cristal de cuarzo
de 32768 Hz, escribiendo para ello el valor DIVA_2 en el campo correspondiente del registro BCSCTL1:
BCSCTL1 = CALBC1_1MHZ + DIVA_2;

2. Implemente la rutina de configuración de puertos de la aplicación Config_Puertos() según las


especificaciones indicadas en la figura 1. Considere que, inicialmente, el semáforo debe estar en
VERDE (para los coches), y el pulsador de peatón provocar una interrupción al pulsarlo. No olvide
configurar aquellos pines que tengan funciones especiales. [1 punto]
void Config_Puertos(void) {
// ------------ Luces LV, LA, LR
P2DIR = BIT2 + BIT1 + BIT0; // P2.2 (LV), P2.1 (LA), P2.0 (LR) -> Salidas
P2OUT = BIT2; // P2.2 (LV) -> ON, P2.1 (LA) -> OFF, P2.0 (LR) -> OFF
// ------------ Pulsador peatón
P1DIR_bit.P3 = 0; // P1.3 -> Entrada
P1REN_bit.P3 = 1; // P1.3 -> Resistencia activa
P1OUT_bit.P3 = 0; // P1.3 -> Resistencia pulldown
P1IFG_bit.P3 = OFF; // Limpia flag P1.3
P1IES_bit.P3 = 0; // P1.3 -> Flanco subida
P1IE_bit.P3 = ON; // Habilita interrupción P1.3
// ------------ Altavoz
P2DIR_bit.P3 = 1; // P2.3 -> TA1.0
P2SEL_bit.P3 = 1;
P2SEL2_bit.P3 = 0;
} // void Config_Puertos(void)
3. Analizando el código de la función principal main (excepto el código encerrado dentro de la estructura
switch), la función de configuración del TimerA0 Config_TA0, y la rutina de interrupción del
TimerA0CCR0 RTI_TA0_CCR0, deduzca cuánto tiempo permanece el semáforo encendido en VERDE,
AMBAR y ROJO. [1.5 puntos]
Analizando el código se puede deducir que la tarea f0 es la encargada de gestionar el cambio de las
luces del semáforo. Esta tarea se activa mediante la rutina de interrupción RTI_TA0_CCR0,
correspondiente a la interrupción generada por el bloque de captura/comparación TA0CCR0 del
temporizador TA0. La funcionalidad de la tarea f0 sobre las luces del semáforo consiste en:
− Alternar la luz encendida mediante las instrucciones P2OUT = P2OUT >> 1; (que desplaza 1 bit el
contenido del registro P2OUT hacia la derecha, produciendo el cambio de luces del VERDE al
AMBAR y del AMBAR al ROJO) y P2OUT = BIT2; (que inicializa las luces del semáforo,
produciendo el cambio de luces del ROJO al VERDE).
− Configurar el tiempo de espera correspondiente para producir la transición entre las luces del
semáforo mediante la instrucción TA0CCR0 = TA0R + semt[idx];
-3/6-
De esta última instrucción se deduce que la variable idx es la que controla el estado (luz encendida)
del semáforo, tomando los valores 0 para el VERDE (estado inicial), 1 para el AMBAR y 2 para el
ROJO. También se puede observar que es el array semt[idx] el que establece el tiempo de duración de
cada estado al modificar el registro TA0CCR0 del temporizador TA0, indicando que se debe producir
una nueva interrupción al transcurrir el tiempo indicado por el valor de semt[idx] a partir del valor
actual de la cuenta del temporizador TA0 determinado por TA0R.
Por último, analizando la configuración del temporizador TA0:
TA0CTL = TASSEL_1|MC_2|ID_3|TACLR;
se puede observar que opera en modo continuo (MC_2) con la señal de reloj ACLK (TASSEL_1) dividida
por 8 (ID_3), es decir, a una frecuencia de 8192/8 = 1024 Hz.
De todo lo anterior se puede concluir que la duración de cada estado es:
− VERDE: idx = 0 → semt[idx] = 0xEC22 = 60450 → t = 60450 / 1024 = 59 s
− AMBAR: idx = 1 → semt[idx] = 0x800 = 2048 → t = 2048 / 1024 = 2 s
− ROJO: idx = 2 → semt[idx] = 0x8C14 = 35860 → t = 35860 / 1024 = 35 s
4. Teniendo en cuenta la información de las preguntas anteriores (incluyendo ahora parte de la
información en la estructura switch del main) y la rutina de interrupción de puerto RTI_Port1, ¿qué
ocurre en cada uno de los estados (VERDE, AMBAR y ROJO) cuando se presiona el pulsador de
peatón? [1.5 puntos]
Inicialmente el semáforo se encuentra en VERDE (P2OUT = BIT2;) y la interrupción del pulsador de
peatón habilitada (P1IE_bit.P3 = ON;). A partir de este estado, el efecto causado al presionar el
pulsador de peatón en cada estado es:
− VERDE: se activa la rutina de interrupción RTI_Port1, correspondiente a la interrupción generada
por el pin 3 del puerto P1 (pulsador de peatón). Dicha rutina de interrupción se encarga por un
lado de deshabilitar la interrupción del propio pulsador de peatón mediante la instrucción
P1IE_bit.P3 = OFF;, y por otro lado de activar la tarea f1. Por su parte, la tarea f1 comprueba
si el tiempo que falta para producir un cambio de luces desde el VERDE al AMBAR mediante la
rutina de interrupción RTI_TA0_CCR0 es mayor de:
(TA0CCR0 - TA0R) > 0x4FFF = 20479 → t = 20479 / 1024 = 19.999 s ~ 20 s

y si es mayor modifica el tiempo que falta para producir dicho cambio de luces desde el VERDE al
AMBAR en 19.999 s ~ 20 s mediante la instrucción TA0CCR0 = TA0R + 0x4FFF;.
− AMBAR/ROJO: al encontrarse el pulsador de peatón deshabilitado no se produce ningún efecto.
NOTA: El pulsador de peatón vuelve a habilitarse al entrar de nuevo en el estado VERDE mediante la
instrucción P1IE_bit.P3 = ON;.
Así pues, presionar el pulsador de peatón sólo tiene efecto en el estado VERDE, y su función es la de
comprobar si el tiempo de espera para pasar al AMBAR es mayor de unos 20 s: si es menor no realiza
ninguna acción, y si es mayor establece dicho tiempo de espera en unos 20 s.
5. Si el pulsador no fuese ideal, ¿sería necesario programar un antirrebote SW en el sistema? [1 punto]
No, pues el pulsador de peatón se deshabilita tras detectar la primera pulsación en el estado VERDE
dentro de la propia rutina de interrupción RTI_Port1, y vuelve a habilitarse dentro de la tarea f0
cuando se alcanza de nuevo el estado VERDE, por lo que permanece deshabilitado como mínimo el
tiempo que duran los estados AMBAR y ROJO (37 s), tiempo más que suficiente para que se extingan
los posibles rebotes del pulsador.
-4/6-
6. Modifique el sistema para que se inicie en el estado correspondiente a AMBAR, siendo el resto del
funcionamiento el mismo que en el código propuesto. [1 punto]
Para implementar esta modificación habría que realizar inicialmente todas aquellas funciones que
realiza el sistema en el estado AMBAR, por lo que habría que tener en cuenta los siguientes aspectos:
− Encender la luz AMBAR: implica sustituir en la función Config_Puertos() la instrucción P2OUT
= BIT2; (enciende LV) por la instrucción P2OUT = BIT1; (enciende LA).

− Actualizar el estado del sistema: implica inicializar correctamente en la definición de las variables
globales la variable idx al valor 1 mediante la instrucción unsigned short int idx = 1;.
− Establecer la duración del estado inicial (AMBAR): implica sustituir en la función Config_TA0()
la instrucción TA0CCR0 = TA0R + semt[0]; (duración VERDE) por la instrucción TA0CCR0 =
TA0R + semt[1]; (duración AMBAR).

− Deshabilitar el pulsador de peatón: implica eliminar en la función Config_Puertos() la


instrucción P1IE_bit.P3 = ON; (habilita interrupción pulsador de peatón).
7. Proponga alguna modificación que mejore el rendimiento energético de la aplicación, sin cambiar su
comportamiento. [0.5 puntos]
La solución más sencilla consiste en utilizar algún modo de bajo consumo mayor que el LPM1
empleado en la aplicación, siempre y cuando dicho modo de bajo consumo no deshabilite la señal de
reloj ACLK necesaria para el funcionamiento de los temporizadores TA0 y TA1. Así pues, se podría
utilizar el modo de bajo consumo LPM3, sustituyendo en la función main() la instrucción
__low_power_mode_1(); (LPM1) por la instrucción __low_power_mode_3(); (LPM3).

8. Considerando el esquema de la figura 1 y el código del programa relacionado con el TIMERA1 y los
bloques comparadores TIMERA0CCR1 y TIMERA0CCR2, ¿en qué condiciones se genera una onda
sonora en el sistema? ¿qué características tiene el sonido emitido? [2 puntos]
La onda sonora se obtiene generando una señal PWM en el pin 3 del puerto P2 donde está conectado el
altavoz, pin que se corresponde con la unidad de salida 0 del temporizador TA1 (TA1.0). Así pues, los
aspectos relacionados con la onda sonora se identifican con aquellas secciones de código que
configuran el temporizador TA1. Analizando el código se pueden deducir los siguientes aspectos:
− Configuración inicial del temporizador TA1: en la función Config_TA1() se configura el
temporizador TA1 en modo ascendente (MC_1) con la señal de reloj ACLK (TASSEL_1) sin dividir
(ID_0), es decir, a una frecuencia de 8192 Hz:
TA1CTL = TASSEL_1|MC_1|ID_0|TACLR;
Además, se establece que la unidad de salida 0 genere un PWM en modo Toggle (OUTMOD_4), por lo
que conmutará su salida cada vez que el valor de la cuenta del temporizador TA1 (TA1R) alcance el
valor del registro TA1CCR0 (es decir, se necesitan dos cuentas de TA1CCR0 para generar un ciclo):
TA1CCTL0 = OUTMOD_4;
Es importante notar que la función Config_TA1() no inicializa el valor del registro TA1CCR0, por
lo que el temporizador no comenzará a funcionar y el PWM no se genera inicialmente.
− Activación/desactivación de la onda sonora: en la tarea f0 se activa/desactiva la generación del
PWM del temporizador TA1, y por lo tanto la onda sonora. La activación se produce en el estado
ROJO (case 2) inicializando el valor del registro TA1CCR0 mediante la instrucción TA1CCR0 = 7; ,
y la desactivación se produce en el estado VERDE (case 0) borrando el valor del registro TA1CCR0
mediante la instrucción TA1CCR0 = 0; .

-5/6-
− Características de la onda sonora: en el estado ROJO (case 2) de la tarea f0 se define la
operación del PWM que generará la onda sonora. En primer lugar, se inicializa el valor del
registro TA1CCR0 a 7, por lo que la frecuencia inicial del PWM será:
f = ACLK/(2*(TA1CCR0+1)) = 512 Hz

Adicionalmente, se programan y habilitan dos interrupciones con el temporizador TA0:


· TA0CCR1 = TA0R + tmod; → tmod = 0x400 = 1024 → t = 1024 / 1024 = 1 s
· TA0CCR2 = TA0R + semt[idx] – HURRY; → semt[2] – HURRY = 0x8C14 – 0x1200 =
0x7A14 = 31252 → t = 31252 / 1024 = 30.52 s ~ 30 s

La primera interrupción (TA0CCR1) se genera cada segundo después de iniciar la onda sonora, y
según la rutina de interrupción asociada a la misma RTI_TA0_CCR12 su efecto (case 2) consiste
en alternar el valor del registro TA1CCR0 entre 7 y 14, por lo que la frecuencia del PWM alternará
entre:
· f = ACLK/(2*(7+1)) = 512 Hz
· f = ACLK/(2*(14+1)) = 273.17 Hz ~ 273 Hz

Así pues, la onda sonora estará formada inicialmente por un pitido tipo sirena que alterna cada
segundo entre 512 Hz y 273 Hz.
La segunda interrupción (TA0CCR2) se genera unos 30 segundos después de iniciar la onda sonora,
y según la rutina de interrupción asociada a la misma RTI_TA0_CCR12 su efecto (case 4) consiste
en reducir a la mitad el valor de la variable tmod que controla el tiempo de activación de la
primera interrupción (TA0CCR1):
TA0CCR1 = TA0R + tmod; → tmod = 0x200 = 512 → t = 1024 / 1024 = 0.5 s

Así pues, la onda sonora estará formada al final (cuando queden unos 5 s para finalizar el estado
ROJO) por un pitido tipo sirena que alterna cada medio segundo entre 512 Hz y 273 Hz, por lo que
se acelera su variación para avisar al peatón de que el estado ROJO está próximo a finalizar.
9. Modifique el sistema para que, si se pulsa el botón en AMBAR, el sistema se quede bloqueado (sin
responder al pulsador ni realizar cambios de luces ni ninguna otra actividad) en bajo consumo, no
pudiéndose salir de dicho estado salvo por un RESET. [1 punto]
Para implementar esta modificación habría que tener en cuenta los siguientes aspectos:
− Habilitar el pulsador de peatón en el estado AMBAR: implica mover en la función main() la
instrucción P1IE_bit.P3 = OFF; (deshabilita interrupción pulsador de peatón) desde el estado
AMBAR (case 1) al estado ROJO (case 2).
− Deshabilitar el temporizador TA0 al presionar el pulsador de peatón en el estado AMBAR: implica
introducir el siguiente código en la rutina de interrupción RTI_Port1:
__interrupt void RTI_Port1(void) {
P1IFG_bit.P3 = OFF;
P1IE_bit.P3 = OFF;
if (idx == 0) {
tareas.f1 = ON;
} // if (idx == 0)
else {
TA0CTL = MC_0;
TA0CCTL0_bit.CCIFG = OFF;
} // else: if (idx == 0)
__low_power_mode_off_on_exit();
} // void RTI_Port1(void)

NOTA: Existen múltiples alternativas para implementar esta modificación.


-6/6-

También podría gustarte