/*
This program was written by Daniel Johnson and Doug Jensen for the MSP430 Analog Gauge Clock Project
Inputs and outputs:
P1.1, P1.3, P1.4 are used as push button inputs
P1.3 is the set button, while this button is held down, the clock can be set by resetting the time to 12:00
P1.4 is the hours button - pressing this while holding down the set button adds hours to the time
P1.1 is the minutes button - pressing this while holding down the set button adds minutes to the time
There is no AM/PM designation on this clock.
hours go from 0-660, increments of 60, Where 0 indicates 1:00 and 660 indicates 12:00
minutes go from 0-649, increments of 11, where 0=0 and 649=59
seconds go from 0-649, increments of 11, where 0=0 and 649=59
P1.2 is the PWM output for seconds
P2.1 is the PWM output for minutes
P2.4 is the PWM output for hours
*/
#include "msp430g2553.h"
unsigned int seconds, minutes, hours = 0;
void flashLED(void);
void addSec(void);
void addMin(void);
void addHour(void);
void delay(int);
void setPWM(void);
int main( void )
{
// Configure clock
BCSCTL3 |= XCAP_1; // enabling built in 6 pF capacitance for crystal
// Configure the Watch dog timer for the RTC
WDTCTL = WDT_ADLY_1000; // watchdog interval timer mode ACLK
IE1 = WDTIE; // enable watchdog timer interrupt
// Configure timers for PWM, timer A1 and A2 will be used
TA0CTL = TASSEL_1 + MC_1;
TA1CTL = TASSEL_1 + MC_1;
TA0CCR0 = 660-1; // Periods for both timers
TA1CCR0 = 660-1;
TA0CCTL0 = OUTMOD_7; // Reset/Set
TA0CCTL1 = OUTMOD_7; // Reset/Set
TA1CCTL0 = OUTMOD_7; // Reset/Set
TA1CCTL1 = OUTMOD_7;
TA1CCTL2 = OUTMOD_7;
setPWM();
// Configure pins for PWM, and Pushbuttons
P1DIR = BIT2+BIT6;
P1SEL = BIT2;
P1OUT = 0x00;
P2OUT = 0x00;
P2DIR = BIT1+BIT4;
P2SEL |= BIT1+BIT4;
P1OUT = BIT1+BIT4+BIT3; // P1.3 Pulled up
P1REN |= BIT1+BIT4+BIT3; // Enable internal pull-up/down resistor on P1.3
P1IE |= BIT3; // P1.3 interrupt enabled
P1IES |= BIT3; // P1.3 Falling edge
P1IFG &= ~BIT3; // P1.3 IFG cleared
_BIS_SR(GIE); // global interrupts enabled
}
// Timer A interrupt
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
flashLED();
addSec();
setPWM();
}
// Push Button Interrupt
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
delay(100); // Debounce delay
if((P1IN & BIT3)== 0){ // Check if button still pressed
P1OUT |= BIT0;
// Reset clock to 1:00
seconds = 0;
minutes = 0;
hours = 0;
while((P1IN & BIT3) == 0){
// Poll minute and hour buttons
if((P1IN & BIT1) == 0){
delay(100); // debounce
if((P1IN & BIT1) == 0){
addMin();
}
}
if((P1IN & BIT4) == 0){
delay(100); // debounce
if((P1IN & BIT4) == 0){
addHour();
}
}
setPWM();
}
}
P1OUT &= ~BIT0;
P1IFG &= ~BIT3; // P1.3 IFG cleared
}
void addSec(){
if(seconds<649){
seconds+=11;;
}
else{
addMin();
seconds = 0;
}
}
void addMin(void){
if(minutes<649){
minutes+=11;
}
else{
addHour();
minutes = 0;
}
}
void addHour(void){
if (hours < 660){
hours +=60;
}
else hours = 0 ;
}
void setPWM(void){
TA0CCR1 = seconds;
TA1CCR1 = minutes;
TA1CCR2 = hours;
}
void flashLED(void){
// Toggle LED
P1OUT ^= BIT6;
__delay_cycles(3000);
P1OUT ^= BIT6;
}
void delay(int time){
int i =0;
for(i=0; i<time; i++){
__delay_cycles(1000);
}
}