Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Microcontroladores de TI
Familia MSP430 de TI
Familia MSP430 de TI
Low Power +
Performance
Low Power +
Performance
Conector del
Emulador USB
Emulación embebida
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
PIN OUT
I2C USCI_B0
UART USCI_A0
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
Formatos de Instrucción
Arquitectura del MSP430
Siete (7) modos de direccionamiento
Modo Ejemplo Descripción
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
Generador de Constantes
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
Proyectos y Workspaces
Proyectos y Workspaces
.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
7 6 5 4 3 2 1 0
P1IN
P1OUT
P1DIR 1 1
7 6 5 4 3 2 1 0
P1IN X
P1OUT 1
P1DIR 1
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
PIN OUT
I2C USCI_B0
UART USCI_A0
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
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
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
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
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();
}} }}
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
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
#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
}
- 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:
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
Transmitter
Master
Receiver
I2C
Transmitter
Slave
Receiver
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) ;
}
; 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