void ConfigureTimerPwm(void) {
timerMode = TIMER_PWM_MODE;
TACCR0 = TIMER_PWM_PERIOD; // TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode. TACCTL0 = CCIE;
TACCTL1 = CCIE + OUTMOD_3; // TACCTL1 Capture Compare TACCR1 = 1; }
void ConfigureTimerUart(void) {
timerMode = TIMER_UART_MODE; // Configure TimerA0 UART TX
CCTL0 = OUT; // TXD Idle as Mark
TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK/8, continuous mode P1SEL |= TXD + RXD; // P1DIR |= TXD; // }
// Function Transmits Character from TXByte void Transmit() {
BitCnt = 0xA; // Load Bit counter, 8data + ST/SP while (CCR0 != TAR) // Prevent async capture CCR0 = TAR; // Current state of TA counter CCR0 += Bitime; // Some time till first bit
TXByte |= 0x100; // Add mark stop bit to TXByte TXByte = TXByte << 1; // Add space start bit
CCTL0 = CCIS0 + OUTMOD0 + CCIE; // TXD = mark = idle while ( CCTL0 & CCIE ); // Wait for TX completion }
// Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) {
if (timerMode == TIMER_UART_MODE) {
CCR0 += Bitime; // Add Offset to CCR0 if (CCTL0 & CCIS0) // TX on CCI0B? {
if ( BitCnt == 0)
CCTL0 &= ~ CCIE; // All bits TXed, disable interrupt else {
CCTL0 |= OUTMOD2; // TX Space if (TXByte & 0x01)
CCTL0 &= ~ OUTMOD2; // TX Mark TXByte = TXByte >> 1; BitCnt --; } } } else {
if (tempPolarity == TEMP_HOT) LED_OUT |= LED1;
if (tempPolarity == TEMP_COLD) LED_OUT |= LED0;
TACCTL0 &= ~CCIFG; } }
#pragma vector=TIMER0_A1_VECTOR __interrupt void ta1_isr(void) {
TACCTL1 &= ~CCIFG;
if (applicationMode == APP_APPLICATION_MODE) LED_OUT &= ~(LED0 + LED1);
else
LED_OUT ^= (LED0 + LED1); }
void InitializeClocks(void) {
BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ;
BCSCTL2 &= ~(DIVS_3); // SMCLK = DCO / 8 = 1MHz }
void InitializeButton(void) // Configure Push Button {
BUTTON_DIR &= ~BUTTON; BUTTON_OUT |= BUTTON; BUTTON_REN |= BUTTON; BUTTON_IES |= BUTTON; BUTTON_IFG &= ~BUTTON; BUTTON_IE |= BUTTON; }
void InitializeLeds(void) {
LED_DIR |= LED0 + LED1; LED_OUT &= ~(LED0 + LED1); }
/* ************************************************************* * Port Interrupt for Button Press
* 1. During standby mode: to exit and enter application mode * 2. During application mode: to recalibrate temp sensor
* *********************************************************** */ #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void)
{
BUTTON_IFG = 0;
BUTTON_IE &= ~BUTTON; /* Debounce */ WDTCTL = WDT_ADLY_250;
IFG1 &= ~WDTIFG; /* clear interrupt flag */ IE1 |= WDTIE;
if (applicationMode == APP_APPLICATION_MODE) {
tempCalibrated = tempAverage; calibrateUpdate = 1; } else {
applicationMode = APP_APPLICATION_MODE; // Switch from STANDBY to APPLICATION MODE
__bic_SR_register_on_exit(LPM3_bits); } }
#pragma vector=WDT_VECTOR __interrupt void WDT_ISR(void) {
IE1 &= ~WDTIE; /* disable interrupt */ IFG1 &= ~WDTIFG; /* clear interrupt flag */
WDTCTL = WDTPW + WDTHOLD; /* put WDT back in hold state */ BUTTON_IE |= BUTTON; /* Debouncing complete */ }
// ADC10 interrupt service routine #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR (void) {
__bic_SR_register_on_exit(CPUOFF); // Return to active mode }