Paso 23: Programar el MSP430
Después de la instalación, abra uso CCS cuando se le pregunta sobre el espacio de trabajo, le permiten hacer uno con el nombre que generó.
Pulse archivo -> Nuevo -> CCSProject
Una ventana pop-up, nombre de su proyecto, juego de zombies.
Luego seleccione MSP430 serie
Entonces en el tipo de búsqueda en: MSP430G2553 (o simplemente encontrarlo)
Seleccione la plantilla LED parpadea y en apertura de abrir y cerrar programa, borrar todo de él.
Pegue el código publicado aquí y presione el pequeño error. Si no tiene problemas, entonces tendrás una pequeña barra de herramientas después de que programe el chip, que es una consola de depuración, y habrá un > botón, púlselo y el MSP430 Launchpad estará enviando datos posteriores a través de UART, para que puedas comprobar los datos del terminal.
#include "msp430g2553.h"
#include < intrinsics.h > / / intrínseca funciones
#include < stdint.h > / / estándar tipos enteros
#define TXD albañilería1 / / TXD en P1.1
#define Bitime 104 //9600 Baud, SMCLK = 1MHz (1MHz/9600) = 104
unsigned char BitCnt; Poco cuenta, utilizada transmisión de bytes
unsigned int TXByte; Valor enviado sobre UART cuando se llama a Transmit()
unsigned int i, j, h;
unsigned int ADCVal;
Definiciones de función
void Transmit(void);
void Single_Measure(unsigned int);
#define NSAMPLES 16 / / número de muestras en cada bloque
void main
{
WDTCTL = WDTPW + WDTHOLD; Dejar de WDT
unsigned int uartUpdateTimer = 10; Bucles hasta que se envía el byte
promedio de uint32_t = 0; Valor medio del bloque de
BCSCTL1 = CALBC1_1MHZ; Rango de ajuste
DCOCTL = CALDCO_1MHZ; SMCLK = DCO = 1MHz
P1DIR | = 0 X 01; Establece P1.0 en dirección de salida
P1SEL | = TXD; //
P1DIR | = TXD; //
__bis_SR_register(GIE); enabled\ interrupciones
/ * Bucle principal * /
while(1)
{
Si ((-uartUpdateTimer == 0))
{
__bis_SR_register (CPUOFF + GIE); LPM0, ADC10_ISR forzará salida
if(0x08 & P1IN) {}
para (i = 0; i < 1000; i ++); Retardo de maniquí para debounce
if(0x08 & P1IN) {}
P1OUT & = ~ 0 x 01; tablero led OFF
}
}
Else {}
para (i = 0; i < NSAMPLES; ++ i) {}
Single_Measure(INCH_4);
ADCVal = ADC10MEM;
promedio += ADCVal; Acumular la suma
}
promedio / = NSAMPLES; Media aritmética de las muestras
P1OUT | = 0 x 01; //board led ON
promedio = promedio & 0xFF;
TXByte = promedio;
}
Transmit();
promedio = 0; //reset media
uartUpdateTimer = 10;
para (h = 0; h < 10000; h ++); Dummy demora entre los ciclos de comunicación
}
}
}
Función transmite caracteres de TXByte
void Transmit()
{
CCTL0 =; TXD inactivo como marca
TACTL = TASSEL_2 + MC_2; SMCLK, modo continuo
BitCnt = 0xA; Cargar contador de Bit, 8 bits + ST/SP
CCR0 = ALQUITRÁN;
CCR0 += Bitime; Tiempo hasta el primer bit
TXByte | = 0 x 100; Añadir el bit de parada a TXByte (que es 1 lógico)
TXByte = TXByte << 1; Añadir el bit de arranque (que es 0 lógico)
CCTL0 = CCIS0 + OUTMOD0 + CCIE; Señal, valor inicial, habilitar interrupciones
mientras (CCTL0 & CCIE); Esperar para la terminación de TX
TACTL = TASSEL_2; SMCLK, temporizador de apagado (para consumo)
}
Rutina de servicio de interrupción de A0 de temporizador
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
CCR0 += Bitime; Agregar desplazamiento a CCR0
Si (BitCnt == 0) / / si todos los bits de TXed, desactivar la interrupción
CCTL0 & = ~ CCIE;
otra cosa
{
CCTL0 | = OUTMOD2; Espacio de TX
Si (TXByte & 0 x 01)
CCTL0 & = ~ OUTMOD2; TX marca
TXByte = TXByte >> 1;
BitCnt--;
}
}
/********************************************************
Rutina de servicio de interrupción ADC10
********************************************************/
#pragma vector = ADC10_VECTOR
__interrupt de vacío ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); Poco clara de CPUOFF de 0(SR)
}
void Single_Measure (unsigned int chan)
{
ADC10CTL0 & = ~ ENC; Desactivar la ADC
ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE; 16 ticks de reloj, ADC en habilitar interrupción del ADC
ADC10CTL1 = ADC10SSEL_3 + chan; Conjunto 'chan', SMCLK
ADC10CTL0 | = ADC10SC; ENC Habilitar e iniciar la conversión
}