Stap 23: Program de MSP430
Na het installeren, open CCS gebruiken wanneer het u vraagt over de werkruimte, te maken met de naam die het gegenereerd.
Druk vervolgens op Bestand -> Nieuw -> CCSProject
Een venster zal knal opwaarts, naam van uw project, Zombie-spel.
Vervolgens Selecteer MSP430 serie
Klik vervolgens in het zoektype in: MSP430G2553 (of vind het)
Selecteer de sjabloon LED knipperen en verwijderen op de opening van het Knipoogje programma, allemaal.
Plak de code gepost hier en druk op de kleine bug. Als je geen problemen, hebt dan zul je een kleine werkbalk nadat je de chip, die een debug console is, programma's en zal er een > knop, druk op het en de MSP430 Launchpad zal sturen retrospectieve gegevens via UART, zodat u de gegevens op de terminal controleren kunt.
#include "msp430g2553.h"
#include < intrinsics.h > / / intrinsieke functies
#include < stdint.h > / / standaard geheel getal typen
#define TXD BIT1 / / TXD op P1.1
#define Bitime 104 //9600 Baud, SMCLK = 1MHz (1MHz/9600) = 104
unsigned char BitCnt; Bits-telling, gebruikt bij het verzenden van byte
unsigned int TXByte; Waarde via UART verzonden wanneer Transmit() wordt aangeroepen
unsigned int i, j, h;
unsigned int ADCVal;
Functiedefinities
nietig Transmit(void);
nietig Single_Measure(unsigned int);
#define NSAMPLES 16 / / aantal monsters in elk blok
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; WDT stoppen
unsigned int uartUpdateTimer = 10; Lussen totdat byte wordt verzonden
uint32_t gemiddelde = 0; Gemiddelde waarde van blok
BCSCTL1 = CALBC1_1MHZ; Stel bereik
DCOCTL = CALDCO_1MHZ; SMCLK = DCO = 1MHz
P1DIR | = 0X01; P1.0 ingesteld op uitgang richting
P1SEL | = TXD; //
P1DIR | = TXD; //
__bis_SR_register(gie); onderbreekt enabled\
/ * Hoofdtoepassing lus * /
while(1)
{
Als ((--uartUpdateTimer == 0))
{
__bis_SR_register (CPUOFF + GIE); LPM0, ADC10_ISR zal dwingen afsluiten
if(0x08 & P1IN) {}
voor (ik = 0; ik < 1000; i ++); Dummy vertraging voor ontdendering
if(0x08 & P1IN) {}
P1OUT & = ~ 0x01; bestuur leidde OFF
}
}
else {}
voor (ik = 0; ik < NSAMPLES; ++ ik) {}
Single_Measure(INCH_4);
ADCVal = ADC10MEM;
gemiddelde += ADCVal; Accumuleren som
}
gemiddelde / = NSAMPLES; Rekenkundig gemiddelde van de monsters
P1OUT | = 0x01; //board leidde ON
gemiddelde = gemiddelde & 0xFF;
TXByte = gemiddelde;
}
Transmit();
gemiddelde = 0; //reset avarage
uartUpdateTimer = 10;
voor (h = 0; h < 10000; h ++); Dummy vertraging tussen communicatie cycli
}
}
}
Functie verzendt personage uit TXByte
VOID Transmit()
{
CCTL0 = UIT; TXD Idle als Mark
TACTL = TASSEL_2 + MC_2; SMCLK, continu-modus
BitCnt = 0xA; Laden van bits teller, 8 bits + ST/SP
CCR0 = TEER;
CCR0 += Bitime; Ingestelde tijd tot eerste stukje
TXByte | = 0x100; Stopbit toevoegen aan TXByte (dat is logisch 1)
TXByte = TXByte << 1; Toevoegen van startbit (dat is logische 0)
CCTL0 = CCIS0 + OUTMOD0 + CCIE; Signaal, eerste waarde instellen, inschakelen interrupts
terwijl (CCTL0 & CCIE); Wachten op beeindiging van de TX
TACTL = TASSEL_2; SMCLK, timer uitschakelen (voor stroomverbruik)
}
Timer A0 interrupt service routine
#pragma vector = TIMER0_A0_VECTOR
void Timer_A (void) __interrupt
{
CCR0 += Bitime; Offset toevoegen aan CCR0
Als (BitCnt == 0) / / als alle bits TXed, uitschakelt interrupt
CCTL0 & = ~ CCIE;
anders
{
CCTL0 | = OUTMOD2; TX ruimte
Als (TXByte & 0x01)
CCTL0 & = ~ OUTMOD2; TX-Mark
TXByte = TXByte >> 1;
BitCnt--;
}
}
/********************************************************
ADC10 interrupt service routine
********************************************************/
#pragma vector = ADC10_VECTOR
ongeldig ADC10_ISR(void) __interrupt
{
__bic_SR_register_on_exit(CPUOFF); Duidelijk CPUOFF bits van 0(SR)
}
VOID Single_Measure (unsigned int chan)
{
ADC10CTL0 & = ~ ENC; Uitschakelen van ADC
ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE; 16 klok teken, ADC op, inschakelen ADC interrupt
ADC10CTL1 = ADC10SSEL_3 + chan; Set 'chan', SMCLK
ADC10CTL0 | = ENC + ADC10SC; Schakelen en conversie te starten
}