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;
}