msp430demo

msp430demo


/**
 * Main.c
 *
 * Authors: Adam Lerner, Will Scott
 */

#include "msp430.h"

/***** definitions *****/
#define PWM_PERIOD        255
#define SENSE_BRIGHT      255
#define SENSE_DARK        (SENSE_BRIGHT + PWM_PERIOD)
//767

/***** pins *****/
#define LED               BIT6
#define BUTTON            BIT3
#define SENSOR            BIT1
#define SENSOR_GND        BIT2

/***** Functions *****/
void setup(void);

/***** mainloop *****/
int main(void) {
  __disable_interrupt();
  setup();
  __enable_interrupt();

  // This code is interrupt driven.
  LPM1;
  __no_operation();
  while (1);
}

void setup(void) {
  // Disable Watchdog.
  WDTCTL = WDTPW | WDTHOLD;
  
  // Turn off power to ports.
  P1DIR = 0;
  P1SEL = 0;
  P1OUT = 0;
  P1REN = 0xFF;
  P2DIR = 0;
  P2SEL = 0;
  P2OUT = 0;
  P2REN = 0xFF;

  // Power LED.
  P1REN &= ~LED;
  P1DIR |= LED;
  P1SEL |= LED;
  
  // LED pwm.
  TACTL = TASSEL_2 | ID_3 | MC_1 | TACLR;
  TACCTL1 = OUTMOD_7;
  TACCR0 = PWM_PERIOD - 1;
  TACCR1 = 0;

  // Power Button.
  P1REN |= BUTTON;
  P1OUT |= BUTTON;
  P1IES |= BUTTON;
  P1IE |= BUTTON;
  
  // Light Sensor.
  P1REN &= ~(SENSOR_GND);
  P1OUT &= ~(SENSOR_GND);
  P1DIR |= SENSOR_GND;
  P1REN |= SENSOR;
  P1OUT |= SENSOR;

  // Light Sensor ADC.
  ADC10CTL0 = SREF_0 | ADC10SHT_2 | ADC10ON;
  ADC10CTL1 = INCH_1 | ADC10DIV_7 | ADC10SSEL_2;
  ADC10AE0 = SENSOR;
}

/***** Interrupts *****/
__attribute__((interrupt(PORT1_VECTOR)))
void Port_1(void) {
  unsigned short data;

  if (P1IFG & BUTTON) {
    // Get sensor value.
    ADC10CTL0 |= (ENC | ADC10SC);
    while (ADC10CTL1 & ADC10BUSY);
    data = ADC10MEM;
      
    // Set PWM.
    if (data < SENSE_BRIGHT) {
      data = SENSE_BRIGHT;
    }
    data -= SENSE_BRIGHT;
    if (data > SENSE_DARK - SENSE_BRIGHT) {
      data = SENSE_DARK - SENSE_BRIGHT;
    }
    TACCR1 = data;

    // Clear interrupt.
    P1IFG &= ~BUTTON;
  }
  return;
}