Está en la página 1de 121

MSP430 Microcontroller

Microcontroladores de TI
Familia MSP430 de TI
Familia MSP430 de TI

Low Power +
Performance

Ultra Low Security


Power + Comm
Familia MSP430 de TI

Low Power +
Performance

Ultra Low Security


Power + Comm
Familia MSP430G2xx Value Line
LaunchPad Development Board

Conector del
Emulador USB

Emulación embebida

Conector eZ430 6-pin

Terminales XTAL
Terminales del MCU
MCU y su Base

Conector de
Botón del P1.3
alimentación
LED's Jumpers Botón de Reset
P1.0 & P1.6
LaunchPad Development Board

Características de la tarjeta de desarrollo:


– LED1 (red) = P1.0
– LED2 (green) = P1.6
– Switch1 = P1.3
– Switch2 = Reset
– Timer UART Transmit = P1.1
– Timer UART Receive = P1.2
Para conmutar los LED's Rojo y Verde es necesario
configurar las terminales de los puertos 1.0 y 1.6 como
salidas y luego intercambiar sus estados lógicos.
Índice
• Características clave
• Arquitectura del CPU
• Sistema de relojes : Clock's
• Interrupciones
• I/O Power consumption @ 2.2V:
• Timers •0.1 μA RAM retention
•0.4 μA Standby mode (VLO)
• ADC's •0.7 μA real-time clock mode

• USCI •220 μA / MIPS active


•Ultra-Fast Wake-Up From Standby Mode in <1 μs
Características clave
Arquitectura de Ultra bajo consumo, extiende la vida útil de la
batería
– 0.1 μA RAM retention
– 0.8 μA real-time clock mode
– 250 μA/MIPS active
16-bit RISC CPU .
– Deep single-cycle register file, previene cuellos de botella en
transferencias de datos.
– Core compacto, reduce el consumo de energía y el costo
– Optimizado para lenguajes de programación de alto nivel
– Sólo 27 instrucciones básicas y 7 modos de direccionamiento
– Vector de interrupciones expandible
In-system 16KB de Flash programable, lo que permite una
programación flexible, así como actualizaciones de los datos.
Características clave
MSP430G2553 pin-out
Hardware

PIN OUT

I2C USCI_B0

UART USCI_A0

SPI USCI_A0 * USCI_B0

GPIO

Emulator / Timer
Programmer /
Serial Comm Analog

Comparator * CAOUT

+3.3 1 20 GND
Red LED ACLK CA0 A0 TA0CLK P1.0 2 19 P2.6 TA1.0 Xin
RX_A0 SOMI CA1 A1 TA0.0 P1.1 3 18 P2.7 Xout
TX_A0 SIMO CA2 A2 TA0.1 P1.2 4 17 Test
Push CA3* A3 VREF- P1.3 5 16 Reset
STE* CLK CA4 A4 VREF+ P1.4 6 15 P1.7 A7 CA7* SDA SIMO*
CLK* STE CA5 A5 TA0.0 P1.5 7 14 P1.6 TA0.1 A6 CA6 SCL SOMI* Green
TA1.0 P2.0 8 13 P2.5 TA1.2
TA1.1 P2.1 9 12 P2.4 TA1.2
TA1.1 P2.2 10 11 P2.3 TA1.0
GND
GND
+3.3
Características clave
MSP430G2553 pin-out
– VCC , VSS : alimentación de voltaje y tierra (ground)
– P1.0 a P1.7, P2.6 y P2.7 son terminales para entradas y
salidas digitales así como otras funciones.
– A0, A1, ... A7, son las entradas del convertidor análogo-
digital
– VREF+ y VREF- son las referencias de voltaje del
convertidos
– ACLK y SMCLK son salidas del reloj del microcontrolador
– SCLK, SDO, y SCL se usan en la interface universal serial
– XIN y XOUT son entradas para la señal del cristal
– RST es activa en bajo y maneja la señal de reset
– NMI es la entrada de interrupción no-mascarable
– TA0.0, TA1.0, TA1.1 y TA1.2 son salidas del temporizador.
Arquitectura del MSP430
Arquitectura del MSP430
Arquitectura del MSP430
Periféricos MSP430G Value Line :
• Entradas Salidas de propósito general (GPIO)
• Terminales programables de manera independiente
• Es posible cualquier combinación de entrada, salida e interrupción
(incluyendo selección de borde de disparo).
• Cada GPIO cuenta con resistencias pull-up / pull-down
individualmente programables.
• Algunas terminales incluyen características touch-sense (PinOsc).
• Temporizador de 16-bits (Timer_A2 o Timer_A3)
• Registros de captura o comparación de registros
• Amplias capacidades de interrupción
• Temporizador WDT+ Watchdog
• También disponible como un temporizador de intervalos
• Reset Brownout
• Proporciona señal de Reset durante el encendido o apagado
• Bajo consumo de corriente.
Arquitectura del MSP430
Periféricos MSP430G Value Line (cont.):
• Comunicación serial
• USI con soporte para I²C y SPI
• USCI con soporte para I²C, SPI y UART
• Comparador_A +
• Entradas inversoras y no inversora
• Filtro de salida RC seleccionable
• Entrada de captura con salida al Timer_A2
• Capacidad de generar interrupciones
• Convertidores ADC (SAR o de doble pendiente) de 10-bits @ 200ksps
• Hasta 8 canales externos (disponibles según el dispositivo)
• Canales internos extra para monitoreo de temperatura y voltaje
• Referencias Vref+ / Vref- programables
• Transferencia directa de los resultados a memoria (DMA) sin
intervención del CPU y extensa capacidad de interrupciones
Arquitectura del MSP430
CPU :
• Arquitectura RISC con 27 instrucciones y 7
modos de direccionamiento.
• Modos de direccionamiento extendido
•- Alcance de 20 bits y densidad de código
mejorada
• Mapa de memoria unificada de 1MB sin
paginación
• Acceso completo a registros incluyendo al
PC: contador de programa, registros de
estados, y SP: Stack Pointer.
• Operaciones de registro en un solo ciclo.
• Registros de 16 bits, reduce lecturas a
memoria.
• Código 100% compatible con versiones
anteriores.
Arquitectura del MSP430
CPU (cont.) :
• Bus de direcciones de 16 bits. Acceso y
instrucciones de salto en toda la memoria.
• Bus de datos de 16 bits permite la
manipulación directa de los argumentos de
toda la palabra.
• Incluye Generadores de constantes (CG1,
CG2); genera seis valores inmediatos lo que
reduce el tamaño del código.
• Transferencias directas de memoria-
memoria (DMA) sin necesidad de un registro
intermedio o intermediación del CPU.
• Formatos de direccionamiento y de
instrucción tanto en Words como en Bytes.
Arquitectura del MSP430
Registros del MSP430 CPU :
• Dieciséis registros de 16 bits cada uno
- Los registros R0, R1, R2, y R3 tienen funciones específicas
- Los registros R4 a R15 son los registros de propósito general
(configurables por el usuario o compilador)
Arquitectura del MSP430
Registros del MSP430 CPU :
• El CPU usa los registros internos junto con variables dedicadas
para realizar operaciones y cálculos aritméticos
• Usa el mismo tamaño de código para operaciones a nivel byte o
word
• Se recomienda en lo posible usar operaciones de 16 bits (word)

16-bit
16-bitaddition
addition Code/Cycles
Code/Cycles
5405
5405 add.w
add.w R4,R5
R4,R5 ;; 1/1
1/1
529202000202
529202000202 add.w
add.w &0200,&0202
&0200,&0202 ;; 3/6
3/6

8-bit
8-bitaddition
addition
5445
5445 add.b
add.b R4,R5
R4,R5 ;; 1/1
1/1
52D202000202
52D202000202 add.b
add.b &0200,&0202
&0200,&0202 ;; 3/6
3/6
Arquitectura del MSP430
Organización de la
Memoria
Direcciones de 16-bit
apuntando a bytes
Alineación en words:
La dirección de un Word
corresponde a la dirección
del byte con la menor
dirección, misma que debe
ser par.
Ordenamiento en modo
Little-endian:
El byte de menor orden es
guardado en la dirección más
baja mientras el byte alto en
la dirección más alta.
Arquitectura del MSP430
0FFFFh Interrupt Vector
0FFE0h Table
Memory Map Flash/ROM
0FFDFh Code Memory
(16kB)
0C000h
Interrupt Vector &
Code memory: Aquí
tenemos un bloque de 010FFh Information Flash/ROM
01000h Memory
16 kBytes de memoria (256 bytes)
tipo flash, para guardar
ahí nuestro código. En
la parte más alta de esa 003FFh RAM RAM
00200h (512 bytes)
memoria se colocan las
001FFh 16-bit
direcciones de las 00100h Peripherals
rutinas de servicio a
000FFh 8-bit
interrupciones (ISR). Peripherals Registros del
00010h
MCU
Mapa del MSP430G2553 8-bit Special
0000Fh Function (512 bytes)
00000h Registers
Arquitectura del MSP430
0FFFFh Interrupt Vector
0FFE0h Table
Memory Map Flash/ROM
0FFDFh Code Memory
(16kB)
0C000h
Information
memory: El bloque
de 256 Bytes de 010FFh Information Flash/ROM
01000h Memory
memoria flash fue (256 bytes)
incorporada para
guardar ahí
información no-volátil, 003FFh RAM RAM
00200h (512 bytes)
como los números
001FFh 16-bit
serie del circuito y 00100h Peripherals
para identificar el tipo
000FFh 8-bit
de microcontrolador. Peripherals Registros del
00010h
MCU
Mapa del MSP430G2553 8-bit Special
0000Fh Function (512 bytes)
00000h Registers
Arquitectura del MSP430
0FFFFh Interrupt Vector
0FFE0h Table
Memory Map Flash/ROM
0FFDFh Code Memory
(16kB)
0C000h
RAM memory:
Bloque de 512 Bytes
de memoria volátil 010FFh Information Flash/ROM
01000h Memory
para guardar variables (256 bytes)
y datos que serán
modificados durante la
ejecución de nuestro 003FFh RAM RAM
00200h (512 bytes)
código.
001FFh 16-bit
00100h Peripherals

000FFh 8-bit
Peripherals Registros del
00010h
MCU
Mapa del MSP430G2553 8-bit Special
0000Fh Function (512 bytes)
00000h Registers
Arquitectura del MSP430
0FFFFh Interrupt Vector
0FFE0h Table
Memory Map Flash/ROM
0FFDFh Code Memory
(16kB)
0C000h
Registros del MCU:
Bloque de 512 Bytes
de direcciones que 010FFh Information Flash/ROM
01000h Memory
apunta a los distintos (256 bytes)
registros que
configuran al los
componentes básicos 003FFh RAM RAM
00200h (512 bytes)
del microcontrolador y
001FFh 16-bit
a sus periféricos. 00100h Peripherals

000FFh 8-bit
Peripherals Registros del
00010h
MCU
Mapa del MSP430G2553 8-bit Special
0000Fh Function (512 bytes)
00000h Registers
Arquitectura del MSP430

27 Core RISC Instructions


Arquitectura del MSP430

Formatos de Instrucción
Arquitectura del MSP430
Siete (7) modos de direccionamiento
Modo Ejemplo Descripción

Registro mov.w R10,R11 Ciclo sencillo

Indexado mov.w 2(R5),6(R6) Procesamiento de Tablas

Symbólico mov.w EDE,TONI Fácil lectura, relativo al PC Atomic

Absoluto mov.w &EDE,&TONI Acceso directo a memoria

Acceso a memoria con


Indirecto a Registro mov.w @R10,0(R11)
apuntadores

Indirecto con Auto- mov.w @R10+,0(R11) Procesamiento de Tablas


incremento
Inmediato mov.w #45h,&TONI Valores constantes ir-restrictos
Arquitectura del MSP430
Format II Format III
Format I
Single +/- 9bit Support
Src, Dest
Operand Offset
add(.b) br jmp clrc
addc(.b) call jc setc
Set completo and(.b) swpb jnc clrz
de bic(.b)
bis(.b)
sxt
push(.b)
jeq
jne
setz
clrn
Instrucciones bit(.b)
cmp(.b)
pop(.b)
rra(.b)
jge
jl
setn
dint
dadd(.b) rrc(.b) jn eint
mov(.b) inv(.b) nop
sub(.b) inc(.b) ret
subc(.b) incd(.b) reti
xor(.b) dec(.b)
decd(.b)
adc(.b)
Bold type sbc(.b)
denotes clr(.b)
dadc(.b)
emulated rla(.b)
instructions rlc(.b)
tst(.b)
Arquitectura del MSP430

Direccionamiento Atómico

Memory
B=B+A B
A

;; Pure
Pure RISC
RISC ;; MSP430
MSP430
push
push R5
R5 add
add A,B
A,B
ld
ld R5,A
R5,A
add
add R5,B
R5,B
st
st B,R5
B,R5
pop
pop R5
R5

 Operaciones memoria-a-memoria No-interrumpibles


 Aplicable para el conjunto completo de instrucciones
Arquitectura del MSP430

Generador de Constantes

 Valores inmediatos generados en Hardware :


-1,0,1,2,4,8
 Reduce el tamaño de código y el número de
ciclos de CPU
 Completamente automático

4314
4314 mov.w
mov.w #0002h,R4
#0002h,R4 ;; With
With CG
CG

40341234
40341234 mov.w
mov.w #1234h,R4
#1234h,R4 ;; Without
Without CG
CG
Arquitectura del MSP430

MSP430 C Data Types (ELF format)


Type Bits Representation
char 8 (aligned to 8-bit boundary)
short 16 Binary, 2's complement
int 16 Binary, 2's complement
long 32 Binary, 2's complement
long long 64 Binary, 2's complement
float 32 IEEE 32-bit
double 64 IEEE 64-bit
long double 64 IEEE 64-bit
Arquitectura del MSP430

Proyectos y Workspaces

Workspace Project Link Source files


Project 1 Link Project
Project
Source files Code and Data
Source files
Project 2 Header filesfiles
Source
Project 3
Header Files
Library filesFiles
Header
Link Header files
Library files Declarations/Defines
Settings and preferences Build and tool
Library filessettings
Build and tool settings
Build and tool settingsLink Library files
Code and Data

• Un Workspace o espacio de trabajo contiene configuraciones y


preferencias, junto con los enlaces a cada proyecto.
• La eliminación de un archivo o proyecto dentro del espacio de trabajo
sólo elimina las ligas, no elimina los archivos.
Arquitectura del MSP430

Proyectos y Workspaces

Workspace Project Link Source files


Project 1 Link Project
Project
Source files Code and Data
Source files
Project 2 Header filesfiles
Source
Project 3
Header Files
Library filesFiles
Header
Link Header files
Library files Declarations/Defines
Settings and preferences Build and tool
Library filessettings
Build and tool settings
Build and tool settingsLink Library files
Code and Data

• Los Proyectos contienen las configuraciones de todo el programa así


como de las herramientas empleadas. Además mantiene los enlaces
a los archivos del proyecto.
• Los proyectos engloban a los archivos de cabecera «.h», a los de
código «.c» así como a las librerías «.lib» y a sus dependencias.
Arquitectura del MSP430
Cadena de compilación-depuración
Standard TI-RTOS Target
Compiler Runtime
.asm Libraries Cfg File
Libraries

.c .lib .ccxml
Launch
Pad
.asm .obj .out
Edit Asm Link Debug
EVM
TI-RTOS
User.cmd .map Stand Alone
Config Emulator
(.cfg) Bios.cmd (MSP430 FET)


El Compilador traduce el código c en ensamblador (.asm) y el
Linker toma ese código e integra las llamadas a librerías (.lib)
junto con el mapa de memoria, lo que produce el archivo .out .
Arquitectura del MSP430

Ejemplo: Device Specific «Header» Files

1. Device header file ( msp430g2553.h )


Register bit-field symbols are found in ‘header’ file

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

2. Device linker command file ( msp430g2553.cmd )


Symbols that represent register locations – which are effectively
addresses – are found in the ‘linker’ command file
Arquitectura del MSP430

Consejos para la Codificación en lenguaje C


• Utilizar variables locales tanto como sea posible. Las variables
locales usan los registros del CPU para alojarse mientras que las
variables globales utilizan localidades en la memoria RAM
• Utilice tipos de datos sin signo siempre que sea posible
• Utilizar punteros para acceder a estructuras y uniones
• Utilice la clase "static const" para evitar que se copie durante el
tiempo de ejecución o «run-time» el contenido de estructuras,
uniones y arreglos.
• Evite en lo posible la operación módulo (lenta y costosa)
• En los Bucles tipo «for», cuente hacia atrás el número de ciclos
deseados hasta alcanzar el valor de «0»
• Conozca su código C y su versión en ensamblador!
Puertos Digitales de Entrada / Salida
(GPIO) del MSP430
Puertos de E/S del MSP430
Características
• El MSP430G2553 dispone de 2 puertos (P1 y P2) GPIO, cada
puerto tiene hasta ocho terminales de E/S (P1.0-P1.7, P2.0-P2.5).
• Cada pin de E/S se puede configurar individualmente para la
entrada o salida de la dirección, y cada línea de E/S puede ser
leída o escrita de forma individual a.
• Cada terminal GPIO :
• Se puede configurar de manera independiente.
• Permite cualquier combinación de entrada o de salida
• Sus Interrupciones son individualmente configurables tanto para
P1 y P2
• Cuenta con registros de datos de entrada y salida
independientes
• Cuenta con resistencias de pull-up/pull-down configurables
Puertos de E/S del MSP430
• GPIO = Entrada / salida de bits
de propósito general
• Puertos de E / S de 8 bits
• 1 a 12 puertos, dependiendo
de la familia y el número de
terminales del dispositivo
• Cada pin es configurable y
controlable individualmente
• Los pines de entrada pueden
generar interrupciones
• Controlado por los registros:
− IN
− OUT
− DIR
− REN
− SEL P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
− ... I/O Port 1 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Puertos de E/S del MSP430
Principales registros
Register
P1IN Input from The 8 bits of data from port P1
port 1
P1OUT Output to Outputs 8 bits of data to port P1
port 1
P1DIR Direction of Bits written as 1 (0) configure
port 1 data corresponding pin for output
transfer (input)
P1SEL Select Bits written as 1 configure the
function for corresponding pin for use by the
port 1 specialized peripheral; 0 configure
general-purpose I/O
Puertos de E/S del MSP430
PxDIR (Dirección del Pin): Entrada o Salida
P1IN.7
P1OUT.7
P1DIR.7
“1”

7 6 5 4 3 2 1 0
P1IN
P1OUT
P1DIR 1 1

 PxDIR.y: 0 = input Ejemplo:


1 = output P1DIR |= 0x81;
Puertos de E/S del MSP430
PxOUT (Valor de salida del Pin)
P1IN.7
P1OUT.7
“1”
P1DIR.7
“1”

7 6 5 4 3 2 1 0
P1IN X

P1OUT 1

P1DIR 1

 PxOUT.y: 0 = low Ejemplo:


1 = high P1OUT |= 0x80;
Puertos de E/S del MSP430
GPIO input: PxREN (Resistencias)
P1IN.7
n
P1OUT.7 up/dow
P1DIR.7
P1REN.7 Enable resistor

6 Los
Los pines
5 de
pines de entrada
entrada se
3se mantienen
mantienen en
en1estado
estado0de
de alta
alta


7 4 2
impedancia
impedancia (Hi-Z),
(Hi-Z), por
por lo
lo que
que pueden
pueden reaccionar
reaccionar aa 00 óó 11
P1IN x

 Las
Las entradas
entradas enen Hi-Z
Hi-Z pueden
pueden flotar
flotar hacia
hacia arriba
arriba // abajo
abajo
P1OUT 1 esto
esto se
se evita
evita con
con resistencias
resistencias pullup
pullup // pulldown
pulldown
P1DIR 0 
 PxREN
PxREN habilita
habilita resistencias
resistencias

 PxOUT
PxOUT selecciona
selecciona pull-up
pull-up (1)
(1) oo -down
-down (0)(0)
P1REN 1

 Los
Los MCU
MCU dede menor
menor coste
coste pueden
pueden no no contar
contar con
con
resistencias
resistencias pullup
pullup // pulldown
pulldown parapara todos
todos loslos puertos
puertos
Puertos de E/S del MSP430
Programa Demo.c
#include <msp430g2553.h>
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x41; // set P1.0 & 6 to outputs
//(red & green LEDs)
for(;;) {
volatile unsigned int i;
P1OUT ^= 0x41; // Toggle P1.0 & 6 using XOR
i = 50000; // Delay
do (i--);
while (i != 0);
}
}
Puertos de E/S del MSP430
Programa Demo.c
Configuración de los LED's conectados al puerto 1
– Los LED's Verde y Rojo se encuentran en las terminales
Port 1 Bit 0 y Bit 6  Configurar estos pines como salidas
 P1DIR toma el valor 0x41 = 01000001
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= 0x41; 0100 // P1.0 & 6 outputs
0001
Para encender/apagar los LED's, se cambia el bit del
registro de salidas de 1 a 0 o viceversa (uso de XOR).
P1OUT ^= 0x41; // toggle P1.0 & 6 on/off
Puertos de E/S del MSP430
P1SEL0 & P2SEL1

La Guía del usuario y


la Hoja de datos nos
dicen cómo configurar
cada terminal de
acuerdo a las funciones
disponibles
Hardware

PIN OUT

I2C USCI_B0

UART USCI_A0

SPI USCI_A0 * USCI_B0

GPIO

Emulator / Timer
Programmer /
Serial Comm Analog

Comparator * CAOUT

+3.3 1 20 GND
Red LED ACLK CA0 A0 TA0CLK P1.0 2 19 P2.6 TA1.0 Xin
RX_A0 SOMI CA1 A1 TA0.0 P1.1 3 18 P2.7 Xout
TX_A0 SIMO CA2 A2 TA0.1 P1.2 4 17 Test
Push CA3* A3 VREF- P1.3 5 16 Reset
STE* CLK CA4 A4 VREF+ P1.4 6 15 P1.7 A7 CA7* SDA SIMO*
CLK* STE CA5 A5 TA0.0 P1.5 7 14 P1.6 TA0.1 A6 CA6 SCL SOMI* Green
TA1.0 P2.0 8 13 P2.5 TA1.2
TA1.1 P2.1 9 12 P2.4 TA1.2
TA1.1 P2.2 10 11 P2.3 TA1.0
GND
GND
+3.3
Modos de Operación del MSP430
Modos de Operación del MSP430
Durante el encendido, el circuito Brownout «BOR» mantiene el
dispositivo en reset hasta que Vcc esté por encima del umbral de
operación
Arranque del BOR:
 Se configura el pin RST/NMI como reset
 Las terminales de E/S GPIO se configuran como entradas
 Se configuran los relojes
 Los periféricos y los registros de la CPU se inicializan (consultar la
guía del usuario)
 El registro de estados (SR) se inicializa
 El Temporizador Watchdog se activa en modo watchdog

El contador de programa (PC) se carga con la dirección del vector


de reset (0xFFFE)
 Si el vector de reset está en blanco (0FFFFh), el dispositivo entra
en el estado de hibernación LPM4
Modos de Operación del MSP430
● Tres niveles de Reset
BOR → POR → PUC → Active (AM)
● BOR es el más completo, seguido
por:
● POR = Power-On Reset
● PUC = Power-Up Clear
● Diferentes eventos desencadenan
diferentes restablecimientos; p.ej.
▪ SVS (supervisor de energía)
activa el POR
▪ WDT (watchdog) desencadena
el PUC
Modos de Operación del MSP430
● Tres niveles de Reset
BOR → POR → PUC → Active (AM)
● Cada nivel toca diferentes bits en
la CPU y los registros periféricos
→ Descripción en la Guía del
usuario:
Modos de Operación del MSP430

PUC
BOR

POR

PUC
Modos de Operación del MSP430
Diagrama de estados
durante el Arranque
del MCU


 Buscar
Buscar elel diagrama
diagrama enen
cada
cada Guía
Guía del
del Usuario
Usuario

 Nota:
Nota: Los
Los modos
modos de
de baja
baja
energía
energía «« Low-Power
Low-Power
Modes
Modes (LPMx)
(LPMx) »» fueron
fueron
removidos
removidos dede este
este diagrama
diagrama
por
por simplicidad
simplicidad
Sistema de Relojes del MSP430
Sistema de Relojes del MSP430


Diversas fuentes de oscilación: on-chip (barata, confiable) y off-chip (precisa)

Muchos divisores de reloj aumentan las frecuencias de reloj disponibles

Todos los dispositivos MSP430 proporcionan al menos 3 relojes internos -
proporciona flexibilidad en el ajuste de la potencia del sistema frente al
rendimiento
Sistema de Relojes del MSP430
• Very Low Power/Low Frequency
Oscillator (VLO)*
• 4 - 20kHz (tipicamente 12kHz)
• 500nA de corriente de standby
• Corriemiento : 0.5%/°C y 4%/Volt
• No disponible en G21x1
• Crystal oscillator (LFXT1)
• Capacitores programables
• Modo Failsafe @ OSC_Fault
• Minimum pulse filter
• Digitally Controlled Oscillator
(DCO)
• De 0 a 16MHz Al encenderse el MCLK y el SMCLK son
• Tolerancia de + 3% alimentados por el DCOCLK @ ~1.1MHz.
• Tabla de calibración de fábrica El ACLK se alimenta del LFXT1CLK en baja
en la memoria Flash freciencia con una carga capacitiva de 6pF. si
el LFXT1 falla el ACLK se conecta al VLO.
Sistema de Relojes del MSP430
G2xxx – No Requiere de Crystal / DCO

// Setting the DCO to 1MHz


if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)

while(1); // Erased calibration data? Trap!


BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
Sistema de Relojes del MSP430
G2xxx – No Requiere de Crystal / DCO

• Dispositivos G2xx1 tienen sólo la calibración para el DCO a 1MHz.


Para otras frecuencias debe realizarse la calibración a mano.
• Dispositivos G2xx2 & G2xx3 (como el G2553) incluyen las 4
constantes mas los valores de calibración para el ADC y el sensor
de temperatura
Sistema de Relojes del MSP430
G2xxx – No Requiere de Crystal / DCO

Fr e q u e nc y
Pick a Hz
e.g. 1M
fDCO MHz

       
DCO Range Select (DCORSEL)
UCSCTL1 DCORSEL
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Sistema de Relojes del MSP430
Very Low Power / Frequency Oscillator
Calibrated 1 MHz DCO

TAR

fVLO = 8MHz/Counts

CCRx

ACLK/8 from VLO

• Calibración durante operación (runtime)


• Timer_A corre bajo la señal calibrada del DCO
• Captura del flanco de subida de la señal ACLK/8 del VLO
• FVLO = 8MHz/cuenta
• Referencia / Librería : SLAA340
Sistema de Relojes del MSP430
Operación del Watchdog

• Si el ACLK o el SMCLK fallan, la


fuente de señal de reloj = MCLK
(WDT+ fail safe feature)

• Si MCLK es generado por un


cristal y el cristal falla, MCLK = DCO
(XTAL fail safe feature)
Sistema de Relojes del MSP430
Operación del Watchdog
Si se completa el recuento del
Reset WDT el CPU se restablece (POR)
WDT is always on at PUC
WDT_A_resetTimer(); Restart countdown
El código programado debe ACLK
borrar periódicamente el
contador del WDT. SMCLK
VLO* up-counter

CPU WDT
 Los Watchdog proporcionan un sistema de seguridad contra
fallas del sistema a partir del set/reset de un temporizador
 WDT+ : cuenta con 4 intervalos de tiempo (G2xx)
Sistema de Relojes del MSP430
Operation del Watchdog

• La señal de reloj activa no puede ser deshabilitada (WDT mode)


• Puede afectar el comportamiento de los modos LPMx así como el
consumo de corriente
• WDT(+) siempre arranca activo
Interrupciones del MSP430
Interrupciones y Eventos
Viaje de Vacaciones : Espera de un evento

An engineering example...
Polling Interrupts
Wake me up when we get there...
Interrupciones y Stack del MSP430
Interrupciones
• Son eventos que afectan a la rutina principal al forzar un cambio
en el flujo normal del programa
• Por cada interrupción el CPU llamará a una sub-rutina (ISR);
• Cuando rutina de servicio de interrupción (ISR) termina su
ejecución, el programa vuelve al punto y estado anterior.
• Hay tres clases de interrupciones:
•- De Reinicio o RESET
•- De interrupción no enmascarable (NMI). Alta prioridad. No tiene
efecto el bit de habilitación global de interrupciones «GIE», pero se
habilita mediante bits individuales (NIE, ACCVIE, OFIE).
•- De interrupción enmascarable. controlada por el registro GIE.
Principalmente usada en periféricos con capacidad de interrupción
(habilitables o deshabilitables por software)
Interrupciones y Stack del MSP430
Esperando por un Evento


Activación de un Botón (GPIO)

Polling Interrupts
while(1)
while(1) {{ //
// GPIO
GPIO button
button interrupt
interrupt
//
// Polling
Polling GPIO
GPIO button
button #pragma
#pragma vector=PORT1_VECTOR
vector=PORT1_VECTOR
while
while (GPIO_getInputPinValue()==1)
(GPIO_getInputPinValue()==1) __interrupt
__interrupt void
void rx
rx (void){
(void){
GPIO_toggleOutputOnPin();
GPIO_toggleOutputOnPin(); GPIO_toggleOutputOnPin();
GPIO_toggleOutputOnPin();
}} }}

100% CPU Load > 0.1% CPU Load


Interrupciones y Stack del MSP430
Servicio a Interrupciones
Una vez que el sistema reconoce la existencia de la bandera de
interrupción, se ejecutan los siguientes 8 pasos:
1) Se completa cualquier instrucción que se esté ejecutando
durante la aparición del evento de interrupción.
2) El controlador toma el registro PC « program counter », que
apunta a la siguiente instrucción, y lo guarda en la pila (stack).
3) El registro de estados «SR» se guarda en la pila o stack.
4) El microcontrolador selecciona la interrupción de mayor
prioridad para ser atendida.
5) La bandera de interrupción es restablecida (reset) de manera
automática cuando la interrupción provino de una sóla fuente, en
caso de múltiples fuentes, la bandera permanecerá en alto en
espera a que las demás fuentes sean atendidas por el software.
Interrupciones y Stack del MSP430
Servicio a Interrupciones
6) El controlador borra el contenido del SR; Esto termina cualquier
modo de bajo consumo; Debido a que el bit GIE se borra,
interrupciones adicionales quedan deshabilitadas.
7) El contenido del vector de interrupción se carga en el
contador del programa «PC»; y el CPU inicia con la lectura de
la primera instrucción de la rutina de servicio de la interrupción.

Pila
(stack)
Interrupciones y Stack del MSP430
Servicio a Interrupciones
8) Al finalizar la ISR, se restablecen los valores previos del PC y
SR y se continua con la siguiente instrucción del programa
principal

Rutinas de Int. ISR1 ISR2 ISR1


(Alta prioridad)

Programa
principal main() main()
(Baja prioridad)
MSP430G2553 Vector Table
Interrupt Source Interrupt Flag System Word Address Section Priority
Interrupt
Power-up PORIFG
External Reset RSTIFG
Watchdog Timer+ WDTIFG Reset 0FFFEh .reset 31
Flash key violation KEYV (highest)
PC out-of-range

NMI NMIIFG Non-maskable


Oscillator Fault OFIFG Non-maskable 0FFFCh .int14 30
Flash memory access violation ACCVIFG Non-maskable

Timer1_A3 TA1CCR0 CCIFG maskable 0FFFAh .int13 29


Timer1_A3 TA1CCR2 TA1CCR1 CCIFG, maskable 0FFF8h .int12 28
TAIFG
Comparator_A+ CAIFG maskable 0FFF6h .int11 27
Watchdog Timer+ WDTIFG maskable 0FFF4h .int10 26
Timer0_A3 TA0CCR0 CCIFG maskable 0FFF2h .int09 25
Timer0_A3 TA0CCR1 TA0CCR1 CCIFG maskable 0FFF0h .int08 24
TAIFG
USCI_A0/USCI_B0 receive UCA0RXIFG, UCB0RXIFG maskable 0FFEEh .int07 23
USCI_B0 I2C status
USCI_A0/USCI_B0 transmit UCA0TXIFG, UCB0TXIFG maskable 0FFECh .int06 22
USCI_B0 I2C receive/transmit
ADC10 ADC10IFG maskable 0FFEAh .int05 21
0FFE8h .int04 20
I/O Port P2 (up to 8) P2IFG.0 to P2IFG.7 maskable 0FFE6h .int03 19
I/O Port P1 (up to 8) P1IFG.0 to P1IFG.7 maskable 0FFE4h .int02 18
0FFE2h .int01 17
0FFE0h .int00 16
Boot Strap Loader Security Key 0FFDEh 15
Unused 0FFDEh to 0FFCDh 14 - 0
Interrupciones y Stack del MSP430
Programación de una rutina de servicio a interrupción : ISR

#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
IE1 &= ~WDTIE; // Deshabilita la interrupción
IFG1 &= ~WDTIFG; // Limpia la bandera de interrupción
WDTCTL = WDTPW + WDTHOLD; // Regresa al WDT en hold state
BUTTON_IE |= BUTTON; // Termina la condición del ISR
}

#pragma vector - La siguiente función es la ISR para el vector seleccionado


_interrupt void - Identifica el nombre de la rutina ISR
No se requiere de un retorno especial de la ISR (e.g. : ensamblador RTI)
Interrupciones y Stack del MSP430
Programación de una rutina de servicio a interrupción : ISR

#pragma vector = TIMER0_A0_VECTOR


__interrupt void TA0_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}

#pragma vector = USCIAB0TX_VECTOR


__interrupt void USCIAB0TX_ISR(void)
{
UCB0TXBUF = (UCB0RXBUF << 4) | 0x0f; // Move RX data to TX
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
Interrupciones y Stack del MSP430
Foreground vs. Background Scheduling
Initialization del Sistema
main() {
 La parte inicial del main() generalmente se
//Init
utiliza para la configuración del sistema
initPMM();
initClocks(); (módulos y periféricos).
... Background
while(1){  La mayoría de los programas embebidos
background
or LPMx incluyen algún tipo de lazo infinito, el cual se
} ejecuta todo el tiempo.
}  A estas instrucciones se les considera de baja
prioridad y por lo tanto se dicen que corren
ISR1
en el transfondo o «Background».
get data process
 Con el MSP430, el código de background
muchas veces contiene instrucciones de
ISR2 Low Power Mode (LPMx) – con lo que se
set a flag manda al CPU/System a invernación hasta
que una interrupción lo despierta.
Interrupciones y Stack del MSP430
Foreground vs. Background Scheduling
Foreground
main() {  La rutina de servicio de interrupciones o
//Init Interrupt Service Routine (ISR) se ejecuta en
initPMM(); respuesta a algún evento de HW de alta
initClocks(); prioridad, el cuál fue habilitado para desviar el
... flujo normal del programa del microcontrolador.
while(1){  Estos eventos suelen diseñarse para cambiar el
background
or LPMx modo en que opera el código principal o
} Background – como por ejemplo sacar al CPU
} de un estado de hibernación.
 Las rutinas de interrupción ISR’s, por default,
ISR1
son NO interrumpibles.
get data process
 Aunque la mayor parte del procesamiento se
podría realizar en la ISR, se recomienda
ISR2 mantener un mínimo de instrucciones ahí y
set a flag realizar la mayor parte del procesamiento en el
ciclo infinito del programa principal main().
Interrupciones y Stack del MSP430
La latencia de interrupción
• Es el tiempo entre el evento de inicio y la ejecución ISR.
• Normalmente necesita 6 ciclos del CPU.
Modos de baja Energía del MSP430
Modos de baja Energía del MSP430
Low Power Operating modes
Modos de baja Energía del MSP430
Low Power Operating modes : Relojes del sistema

• ACLK: Auxiliary clock. ACLK se divide entre 1, 2, 4, u 8 gracias a


un pre-escalador configurable por software.
• MCLK: Master clock. MCLK se divide entre 1, 2, 4, u 8 y es usado
por el CPU y el sistema.
• SMCLK: Sub-main clock. SMCLK se divide entre 1, 2, 4, u 8 y es
seleccionable por software por cada periférico individual
Modos de baja Energía del MSP430
Low Power Operating modes

Mode CPU and Clocks

Active CPU active. Todos los relojes


habilitados están activos

LPM0 CPU, MCLK deshabilitados.


SMCLK, ACLK activos

LPM1 CPU, MCLK deshabilitados. DCO


deshabilitados si no es usado para
el SMCLK. SMCLK, ACLK activo

LPM2 CPU, MCLK, SMCLK, DCO


deshabilitados. ACLK activo

LPM3 CPU, MCLK, SMCLK, DCO y DC


Gen deshabilitados. ACLK activo

LPM4 CPU y todos los relojes


deshabilitados
Modos de baja Energía del MSP430
Estrategias de ahorro :
• Hay que reducir al mínimo el consumo de corriente instantánea
• Mandar la mayoría del tiempo al microcontrolador al modo de bajo
consumo
• El MSP430 está diseñado para operar a muy baja energía, pero el
diseño y uso del desarrollador tienen un mayor impacto en la
eficiencia energética neta del sistema.
“Instant on” clock
Modos de baja Energía del MSP430
Estrategias de ahorro :
• El consumo de energía aumenta con :
• Nivel de Vcc
• Velocidad de reloj del CPU (MCLK)
• Temperatura
• La des-aceleración del MCLK reduce la potencia instantánea, pero
por lo general aumenta el tiempo de procesamiento (active duty cycle)
• Los ahorros de energía pueden cancelarse por este motivo
• La operación @ 8 MHz MCLK maximiza el rendimiento para el
consumo de corriente mínima por MIPS.
• Intervalo de operación completa (hasta 2,2 V)
• Escoja el voltaje del CPU de acuerdo a la velocidad de MCLK
elejida
Modos de baja Energía del MSP430
Estrategias de ahorro :
• Concordancia entre voltaje de alimentación y la velocidad de reloj
• La operación puede resultar intermitente o fallar si el voltaje
seleccionado para Vcc es menor que el mínimo estipulado.

Modos de baja Energía del MSP430
Terminales no conectadas :
• Las entradas digitales están expuestas a
corrientes «shoot-through» si se
presentan voltajes en la entrada entre
VIL y VIH
• Los puertos GPIO no deben "flotar"
(dejan sin conectar) :
• Deben ser configurados como salidas
• Deben ser conectados a Vcc o
Ground a través de un dispositivo
externo
• Deben estar conectados a una
resistencia de pull-up / down

Temporizador (Timer_A)
Temporizador

El WDT es un timer de 16-bit
que puede ser usado como
watchdog o como un
temporizador común. El
módulo del WDT puede
reiniciar el sistema si después
de un intervalo de tiempo
asignado no hubo respuesta
por parte del CPU.

El registro de control del WDT
está protegido por un
password y está activo al
encender el microcontrolador
WDTCTL = WDTPW + WDTHOLD;
Temporizador: Timer_A

El Timer_A es un temporizador/contador de 16 bits con
tres registros de comparación o captura y cuenta con:

4 modos de funcionamiento

Fuente de reloj seleccionable y configurable

Salidas configurables con capacidad de PWM
Temporizador: Timer_A
Registro TACTL del Timer_A
Convertidor Analógico Digital
(ADC10)
Convertidor ADC10
 ADC (SAR) de 10-bit
 8 entradas externas
 más Vcc y temperatura interna
 200 ksps+
 Reloj de conversión seleccionable
 Modos de Operación:
 Single
 Sequence
 Repeat-single
 Repeat-sequence
 Vref Interna o Externa
Direct
 Disparo por Timer-A Data
Transfer
Transfer
 Capacidad de Interrumpir el CPU Controller
Controller

 Data Transfer Controller (DTC)


 Auto power-down
Convertidor ADC10

Características del convertidor ADC de 10 bits:

200 kbps de tasa máxima de conversión. Con periodos de
sampling & hold programables.

La conversión puede ser iniciada por SW o por el Timer_A

Fuente del voltaje de referencia seleccionable por software ya
sea éste externo o interno (1,5 V o 2,5 V). El ADC core y el
voltaje de referencia pueden ser alimentados por separado.

Hasta 8 canales externos de conversión (A0 a A7)

Fuente de reloj seleccionable

Modos de conversión: Single-channel, repeated single-
channel, sequence, y repeated sequence

Incluye controlador de transferencia de datos para el
almacenamiento automático de resultados.
Convertidor ADC10

Tiempo de Conversión:

 Vref debe establecerse <30us

 Tiempo de S&H configurable

 La conversión tarda 13 ciclos de reloj

- ADC10OSC (~5MHz)

- ACLK

- MCLK

- SMCLK
Convertidor ADC10

Pasos para inicial al ADC10:
1) Definir los puertos que serán utilizados como canales de entrada
analógica. (INCHx)
2) Seleccionar la fuente de reloj para la operación (ADC10SSELx)
3) Seleccionar un modo de conversión (por ejemplo, continuo, de una
sóla vez, etc). (CONSEQx)
4) Seleccione la tensión de referencia VREF. (SREFx)
5) Seleccione el tiempo de muestreo y retención para la conversión.
(ADC10SHTx)
6) Habilitar el pin correspondiente elegido para la entrada analógica.
7) Encender al propio ADC. (ADC10ON)
8) Permitir al ADC hacer la lectura.
9) Lea el valor después de la conversión; establecer una variable
para guardar la lectura.
Convertidor ADC10

Ejemplo:

ADC10CTL1 = INCH_3 + CONSEQ_1; // A3/A2/A1, single sequence

ADC10CTL0 = ADC10ON + ADC10IE; // ADC10ON, interrupt enabled

ADC10AE0 |= 0x0E; // P1.1,2,3 ADC option select

ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start


Convertidor ADC10

Mejora del desempeño: Autoscan + DTC

AUTO
Data2
ADC Data1
//
// Software
Software Data0
Res[pRes++] DTC
Res[pRes++] == ADC10MEM;
ADC10MEM; Data2
ADC10CTL0 &= ~ENC;
ADC10CTL0 &= ~ENC;
if
if (pRes
(pRes << NR_CONV)
NR_CONV)
{{ //
CurrINCH++; // Autoscan
Autoscan ++ DTC
DTC
CurrINCH++; _BIS_SR(CPUOFF);
_BIS_SR(CPUOFF);
ifif (CurrINCH
(CurrINCH ==== 3)
3)
CurrINCH
CurrINCH == 0;0;
ADC10CTL1 &= ~INCH_3;
ADC10CTL1 &= ~INCH_3;
ADC10CTL1 Fully Automatic
ADC10CTL1 |=|= CurrINCH;
CurrINCH;
ADC10CTL0 |= ENC+ADC10SC;
ADC10CTL0 |= ENC+ADC10SC;
}}

70 Cycles / Sample
Universal Serial Communication
Interface
Interface de comunicación : USCI
SCLK
 SPI MOSI
SPI MISO
SPI
• Serial Peripheral Interface Master Slave
CS
• Single Master/Single Slave

Vdd
R R

 I2C SDA
SCL
• Inter-Integrated Circuit Interface
• Single Master/Multiple Slaves C DAC ADC C
Master Slave Slave Slave

 UART
Tx Rx
• Universal Asynchronous
Receiver/Transmitter
R/T Rx Tx R/T
• Full duplex
Interface de comunicación : I²C

I²C Bus Connection Diagram

Los 2 resistores de pull up son necesarios para la correcta


operación de enlace I²C
Interface de comunicación : I²C

Transmitter

Master

Receiver
I2C
Transmitter

Slave

Receiver

Posibles modos de operación


Interface de comunicación : I²C

I²C data transfer: El primer byte después del bit de inicio contiene
la dirección del esclavo (7 bits) más el bit R/W. Cuando R/W = 0,
el maestro transmite datos al esclavo, con R/W = 1, el maestro
recibe y el esclavo manda los datos. El bit ACK se envía desde el
receptor después de cada byte en el 9no. ciclo de reloj SCL.
Interface de comunicación : I²C
Código de ejemplo
void Init_i2c(uint8_t devAddr)
{
UCB0CTL1 |= UCSWRST; // Enable SW reset
• // I2C Master in synchronous mode
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK,
// keep SW reset
UCB0BR0 = 10; // fSCL = 1Mhz/10 = ~100kHz
UCB0BR1 = 0;
P1SEL = BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2 = BIT6 + BIT7; // Assign I2C pins to USCI_B0
UCB0I2CSA = devAddr; // Slave Address is 069h
UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCB0RXIE + UCB0TXIE; // Enable RX and TX interrupt
}
Interface de comunicación : UART


En el modo asíncrono, los módulos USCI_Ax conectan
el MSP430 a cualquier sistema externo a través de dos
terminales, UCAxRXD y UCAxTXD. El modo UART se
selecciona al poner el bit UCSYNC en cero.


En el modo UART, el USCI transmite y recibe
caracteres de otro dispositivo a un bit rate (velocidad
de bits) pre-configurada de manera asíncrono (sin
señal de reloj externa). La sincronización para cada
byte de información se basa en la velocidad de
transmisión seleccionada en la USCI. Tanto la
transmisión como la recepción utilizan la misma
frecuencia de transmisión (baudrate).
Interface de comunicación : UART

Las características más importantes de la comunicación
serial son:
– la velocidad de transmisión
– El número de bits de datos
– El número de bits de paro
– Y si cuenta con bit de paridad.
Interface de comunicación : UART

Configuración del periférico USCI como UART:

void initUart(void)
{
UCA0CTL1 |= UCSSEL_2; // Use SMCLK
UCA0BR0 = 104; // 9600 @ 1MHz
UCA0BR1 = 0; // 9600 @ 1MHz
UCA0MCTL = UCBRS0 // Modulation UCBRSx = 1
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine
IE2 |= UCA0TXIE;
}
Interface de comunicación : SPI


Características del modo SPI incluyen:
– 7 bits u 8 bits de longitud de datos
– 3 pines o 4 pines de operación de SPI
– Modos Maestro o Esclavo
– Registros de corrimiento de Transmisión y Recepción
independientes
– Registros Buffer de Transmisión y Recepción
independientes
– Control de fase y polaridad para la señal de reloj UCLK
– Frecuencia de reloj UCLK programable en modo maestro
– Capacidad de interrupción independiente para
Transmisión y Recepción.
Interface de comunicación : SPI
Interface de comunicación : SPI

Configuración del periférico USCI como SPI:

void initSPI(void)
{
P1SEL = BIT1 + BIT2 + BIT4;
P1SEL2 = BIT1 + BIT2 + BIT4;
UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;
UCA0CTL1 |= UCSSEL_2;
UCA0BR0 |= 0x02;
UCA0BR1 = 0;
UCA0CTL1 &= ~UCSWRST;
IE2 |= UCA0RXIE;
}
Notas de Programación C embebido
Notas de Programación C embebido


Sin printf(), no hay operaciones GUI (gráficas)

No hay necesidad de un «end» para el programa

Controla E / S principalmente

Enfocado al control de periféricos a través de sus
registros especiales.

Operaciones se realizan configurando registros en
grupos de bits, bytes y words.

Control completo del CPU

Sin un sistema operativo «OS»
Notas de Programación C embebido
variables volátiles: unsigned int i volatile;

La variable puede parecer cambiar de manera "espontánea",
sin la acción directa por el programa del usuario

Lo anterior puede ser debido a la manera en que los
dispositivos de E/S están mapeados en memoria

El Compilador debe tener cuidado en su optimización

Ej .: Por eficiencia NO se guarda una copia de la variable
en un registro; NO se debe asumir que la variable
permanece constante cuando el compilador optimiza la
estructura del programa, por ejemplo, al organizar
lazos condicionales.

Los registros periféricos asociados con los puertos de entrada
deben ser declarados como «volatile»
Notas de Programación C embebido
variables volátiles: unsigned int i volatil;
static int foo;
void bar(void) {
foo = 0;
while (foo != 255) ;
}

La etapa de optimización del compilador pensará que foo


nunca cambia dentro del código y tratará de optimizarlo.
static int foo;
void bar(void) {
foo = 0; La instrucción volatile en la
while (true) ; declaración de la función foo
} previene esta optimización
Notas de Programación C embebido
Manipulación de Bits
– Característico en micros y procesadores embebidos
– Máscara de Bit's:
set a bit P1OUT = P1OUT | BIT3
clear a bit P1OUT &= ~BIT3
toggle a bit P1OUT ˆ= BIT3
– Campo de Bit's:
struct {
unsigned short TAIFG:1;
unsigned short TAIE:2;
unsigned short TACLR:5;
} TACTL_bit;
Uso: TACTL_bit.TAIFG = 1
Notas de Programación C embebido
Aspectos adicionales

Los Programas para sistemas embebidos tienden a ser
simples, sin gran cantidad de manipulaciones complejas de
datos.

Gran parte de código está generalmente enfocada al control
de periféricos a través de la configuración de sus registros
especiales

Las Operaciones en bits, bytes o words son importantes.

Operaciones básicas:

El cambio y la rotación de los bits

Operaciones lógicas (Booleanas) a nivel de bit (A && B) y
operaciones entre bits (A y B)

Uso de máscaras de bits para probar y modificar bits
individuales.
Notas de Programación C embebido

Uso de la estructura en C «Union» para la manipulación de
bits individuales a la par de escritura de bytes/words
completos
bit 0
union {
unsigned short TACTL; // Timer_A Control
struct {
unsigned short TAIFG : 1;// Timer_A counter interrupt flag
unsigned short TAIE : 1; // Timer_A counter interrupt enable
unsigned short TACLR : 1; // Timer_A counter clear
unsigned short : 1;
unsigned short TAMC : 2; // Timer_A mode control
unsigned short TAID : 2; // Timer_A clock input divider
unsigned short TASSEL : 2; // Timer_A clock source select
unsigned short : 6;
} TACTL_bit;
} TimerA;
Código ensamblador
ORG 0F800h ; Program «Toggle»
Toggle mov.w #0280h,SP ; Initialize SP
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL
; Stop WDT
SetupP1 bis.b #001h,&P1DIR ; P1.0 output
Mainloop xor.b #001h,&P1OUT ; Toggle P1.0
Wait mov.w #050000,R15 ; Delay to R15
L1 dec.w R15 ; Decrement R15
jnz L1 ; Delay over?
jmp Mainloop ; Again

; Interrupt Vectors
ORG 0FFFEh ; MSP430 RESET Vector
DW Toggle
END
Código ensamblador
ORG 0F800h ; Program «Toggle»
Toggle mov.w #0280h,SP ; Initialize SP
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL
; Stop WDT
SetupP1 bis.b #001h,&P1DIR ; P1.0 output
Mainloop xor.b #001h,&P1OUT ; Toggle P1.0
Wait mov.w #050000,R15 ; Delay to R15
L1 dec.w R15 ; Decrement R15
jnz L1 ; Delay over?
jmp Mainloop ; Again

; Interrupt Vectors
ORG 0FFFEh ; MSP430 RESET Vector
DW Toggle
END
Código ensamblador

El estilo de programa anterior se conoce como
«absolute assembly», ya que las direcciones de
memoria se dan explícitamente en la fuente mediante
directivas ORG.

La otra alternativa es que confiarle al «linker /
loader» la determinación de la dirección de inicio o
salto de cada rutina; a esto se le conoce como
«relocatable assembly»

El programa no debe contener direcciones absolutas,
por ejemplo, saltar a una dirección de 16 bits, sólo
debe tener direcciones relativas, por ejemplo, con
relación al valor actual del contador de programa «PC».
Material para el curso

• MSP430 Lauchpad $9.90 USD


https://estore.ti.com/MSP-EXP430G2-MSP4
30-LaunchPad-Value-Line-Development-kit
-P2031.aspx

• Capacitive Touch BoosterPack $10USD


https://estore.ti.com/430BOOST-SENSE1-
MSP430-Capacitive-Touch-BoosterPack-P2
361.aspx

MSP430 Capacitive Touch Bundle $15USD


https://estore.ti.com/MSP430-Capacitive-
Touch-Bundle-P3176.aspx
123

También podría gustarte