Zombie Attack! Lätt att bygga! (23 / 25 steg)
Steg 23: Programmera MSP430
Efter installerande, öppna CCS användning när den frågar dig om arbetsytan, gör det möjligt att göra ett med namnet den genererat.
Tryck sedan på Arkiv -> Ny -> CCSProject
Ett fönster kommer att dyka upp, namnge ditt projekt, Zombie spel.
Sedan Välj MSP430 serien
Sedan i söktyp i: MSP430G2553 (eller tycker att det är)
Välj mallen blinkar LED och på öppnandet av programmet blink, ta bort allt.
Klistra in koden postat här och tryck på den lilla buggen. Om du har inga problem, då du kommer ha ett litet verktygsfält efter det program det chip, som är en Felsökningskonsolen, och det kommer att finnas en >-knappen, tryck och MSP430 startfönstret kommer att sända tillbaka data via UART, så du kan kolla data på terminal.
#include "msp430g2553.h"
#include < intrinsics.h > / / inneboende funktioner
#include < stdint.h > / / Standard heltal typer
#define TXD BIT1 / / TXD på P1.1
#define Bitime 104 //9600 Baud, SMCLK = 1MHz (1MHz/9600) = 104
unsigned char BitCnt; Bitars räknare, används när du överför byte
unsigned int TXByte; Värdet som skickas över UART när Transmit() anropas
unsigned int i, j, h;
unsigned int ADCVal;
Funktionsdefinitioner
void Transmit(void);
void Single_Measure(unsigned int);
#define NSAMPLES 16 / / antal prover i varje block
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; Stoppa WDT
unsigned int uartUpdateTimer = 10; Loopar tills byte skickas
uint32_t medelvärde = 0; Medelvärdet av block
BCSCTL1 = CALBC1_1MHZ; Ange intervall
DCOCTL = CALDCO_1MHZ; SMCLK = DCO = 1MHz
P1DIR | = 0X01; Ange P1.0 till utgång riktning
P1SEL | = TXD; //
P1DIR | = TXD; //
__bis_SR_register(GIE); avbryter enabled\
/ * Huvudprogrammet ögla * /
While(1)
{
om ((--uartUpdateTimer == 0))
{
__bis_SR_register (CPUOFF + GIE); LPM0, ADC10_ISR kommer att tvinga exit
IF(0x08 & P1IN) {
för (jag = 0; jag < 1000; i ++); Dummy fördröjning för debounce
IF(0x08 & P1IN) {
P1OUT & = ~ 0x01; styrelsen leds av
}
}
annat {
för (jag = 0; jag < NSAMPLES; ++ jag) {
Single_Measure(INCH_4);
ADCVal = ADC10MEM;
genomsnittliga += ADCVal; Ackumulera summan
}
i genomsnitt / = NSAMPLES; Aritmetiska medelvärdet av prover
P1OUT | = 0x01, //board ledde ON
genomsnittliga = genomsnitt & 0xFF;
TXByte = genomsnittet.
}
Transmit();
genomsnittliga = 0; //reset Snittade
uartUpdateTimer = 10;
för (h = 0; h < 10000; h ++); Dummy fördröjning mellan kommunikation cykler
}
}
}
Funktionen överför karaktär från TXByte
void Transmit()
{
CCTL0 = UT; TXD Idle som Mark
TACTL = TASSEL_2 + MC_2; SMCLK, kontinuerligt läge
BitCnt = 0xA; Ladda bitars räknare, 8 bitar + ST/SP
CCR0 = TJÄRA;
CCR0 += Bitime; Ställ in tid till första biten
TXByte | = 0x100; Lägga till stoppbit i TXByte (vilket är logiskt 1)
TXByte = TXByte << 1. Lägg till startbit (vilket är logiskt 0)
CCTL0 = CCIS0 + OUTMOD0 + CCIE; Ställa in signal, ursprungliga värde, aktivera avbrott
samtidigt (CCTL0 & CCIE); Vänta TX slutförandet
TACTL = TASSEL_2; SMCLK, timer off (för energiförbrukning)
}
Timer A0 avbrottstjänstens rutin
#pragma vektor = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
CCR0 += Bitime; Lägga till Offset till CCR0
om (BitCnt == 0) / / om alla bitar TXed, inaktivera avbrott
CCTL0 & = ~ CCIE;
annat
{
CCTL0 | = OUTMOD2; TX utrymme
om (TXByte & 0x01)
CCTL0 & = ~ OUTMOD2; TX Mark
TXByte = TXByte >> 1.
BitCnt--;
}
}
/********************************************************
ADC10 avbrottstjänstens rutin
********************************************************/
#pragma vektor = ADC10_VECTOR
__interrupt ogiltiga ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); Tydlig CPUOFF lite från 0(SR)
}
void Single_Measure (unsigned int chan)
{
ADC10CTL0 & = ~ ENC; Inaktivera ADC
ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE; 16 klockan tickar, ADC på, aktiverar ADC avbrott
ADC10CTL1 = ADC10SSEL_3 + chan; Ange "chan", SMCLK
ADC10CTL0 | = ENC + ADC10SC; Aktivera och starta konvertering
}