3 static volatile unsigned int ADC_Result;
4 static volatile unsigned int irq_events = 0;
5 enum {ev_btn1 = 0, ev_btn2, ev_pir1, ev_pir2, ev_tmr, ev_adc, ev_MAX};
7 #ifdef ADCSC /* Let us hope that this is a "new" model */
10 # define PBTN(x) P2##x
13 # define BIT_BTN2 BIT7
17 # define PBTN(x) P1##x
26 unsigned int Time_Count = 0;
27 unsigned int Time_Left = 5;
29 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
31 P1DIR |= BIT_RL|BIT_GL|BIT7; // Set LEDs & PWM to output direction
32 P1OUT &= ~(BIT_RL|BIT_GL); // LEDs off
34 P1SEL1 |= BIT7; // PWM out
36 P1SEL |= BIT7; // PWM out
40 PBTN(DIR) &= ~(BIT_BTN|BIT_BTN2); // Buttons
41 PBTN(OUT) |= BIT_BTN|BIT_BTN2; // Pull up
42 PBTN(REN) |= BIT_BTN|BIT_BTN2; // Enable pull-up
43 PBTN(IES) |= BIT_BTN|BIT_BTN2; // INT on Hi->Lo edge
44 PBTN(IE) |= BIT_BTN|BIT_BTN2; // INT enable
46 P2DIR &= ~(BIT4|BIT5); // PIR Sensors
47 P2OUT &= ~(BIT4|BIT5); // Pull down
48 P2REN |= BIT4|BIT5; // Enable pull-down
49 P2IES &= ~(BIT4|BIT5); // INT on Lo->Hi edge
50 P2IE |= BIT4|BIT5; // INT enable
54 #ifdef ADCPCTL4 /* Newer model */
55 SYSCFG2 |= ADCPCTL4|ADCPCTL5; // disconnect pin 4 and 5 from GPIO
56 ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON, S&H=16 ADC clks
57 ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC; sampling timer
58 ADCCTL2 |= ADCRES; // 10-bit conversion results
59 ADCMCTL0 |= ADCINCH_4; // A4 ADC input select; Vref=AVCC
60 ADCIE |= ADCIE0; // Enable ADC conv complete interrupt
61 // channel 5 is unused, reserved for measuring current
63 ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADCON, S&H=16 ADC clks
64 ADC10CTL1 = INCH_4; // A4 ADC input select
65 // channel 5 is unused, reserved for measuring current
71 # define TASSEL__SMCLK TASSEL_2
76 #ifndef MC__CONTINUOUS
77 # define MC__CONTINUOUS MC_2
80 // Configure timer A0 for PWM
81 TA0CCR0 = 10000-1; // PWM Period
82 TA0CCTL2 = OUTMOD_7; // CCR2 reset/set
83 TA0CCR2 = 500; // CCR2 PWM duty cycle
84 TA0CTL = TASSEL__SMCLK | MC__UP | TACLR;// SMCLK, up mode, clear TAR
86 //Configure timer A1 for counting time
87 TA1CTL |= TASSEL__SMCLK | MC__CONTINUOUS | TACLR | TAIE;
88 // SMCLK, no divider, continuous mode, interrupt enable
91 // Disable the GPIO power-on default high-impedance mode to activate
92 // previously configured port settings
100 _disable_interrupts();
103 _enable_interrupts();
105 // Button 2 or PIR events initiate light measurement and tuns on green led
106 if (events & (1<<ev_btn2|1<<ev_pir1|1<<ev_pir2)) {
107 if (Duty_Cycle > 1) {
111 // Sampling and conversion start
113 ADCCTL0 |= ADCENC | ADCSC;
115 ADC10CTL0 |= ENC + ADC10SC;
117 P1OUT |= BIT_GL; // Set green LED on
120 // End of light measurement,
121 // set new Duty_Cycle and zero increment and turn off green led
122 if (events & 1<<ev_adc) {
123 P1OUT &= ~BIT_GL; // Clear green LED off
126 if (ADC_Result < 200)
132 // Button 1 sets non-zero increment (and toggles it)
133 if (events & 1<<ev_btn1) {
134 if (Duty_Cycle > 5000) {
143 // Timer event (100 ms) changed duty cycle and flashes red led
144 if (events & 1<<ev_tmr) {
145 if (Time_Count++ > 10) {
147 P1OUT ^= BIT_RL; // blink
150 else if (Duty_Cycle > 1)
155 else if (Increment > 0)
157 else if (Increment < 0)
159 if (Duty_Cycle < 1) {
163 if (Duty_Cycle > (10000-1)) {
164 Duty_Cycle = 10000-1;
167 TA0CCR2 = Duty_Cycle;
169 __bis_SR_register(LPM0_bits | GIE);
172 return 0; /* not reached */
175 // TIMER interrupt routine
176 #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
177 #pragma vector = TIMER1_A1_VECTOR
178 __interrupt void Timer_A (void)
179 #elif defined(__GNUC__)
180 void __attribute__ ((interrupt(TIMER1_A1_VECTOR))) Timer_A (void)
182 #error Compiler not supported!
185 switch(__even_in_range(TA1IV,TA1IV_TAIFG))
188 break; // No interrupt
190 break; // CCR1 not used
192 break; // CCR2 not used
194 irq_events |= 1<<ev_tmr;
195 __bic_SR_register_on_exit(LPM0_bits); // Wake up
203 # define ADCMEM0 ADC10MEM
204 # define ADC_VECTOR ADC10_VECTOR
207 // ADC interrupt service routine
208 #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
209 #pragma vector=ADC_VECTOR
210 __interrupt void ADC_ISR(void)
211 #elif defined(__GNUC__)
212 void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void)
214 #error Compiler not supported!
218 switch(__even_in_range(ADCIV,ADCIV_ADCIFG))
224 case ADCIV_ADCTOVIFG:
234 ADC_Result = ADCMEM0;
235 irq_events |= 1<<ev_adc;
236 __bic_SR_register_on_exit(LPM0_bits); // Wake up
245 // GPIO interrupt service routine
246 #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
247 #pragma vector=PORT2_VECTOR
248 __interrupt void Port_2(void)
249 #elif defined(__GNUC__)
250 void __attribute__ ((interrupt(PORT2_VECTOR))) Port_2 (void)
252 #error Compiler not supported!
255 if (PBTN(IFG) & BIT_BTN) {
256 irq_events |= 1<<ev_btn1;
257 PBTN(IFG) &= ~BIT_BTN; // Clear button IFG
260 if (PBTN(IFG) & BIT_BTN2) {
261 irq_events |= 1<<ev_btn2;
262 PBTN(IFG) &= ~BIT_BTN2; // Clear button 2 IFG
266 irq_events |= 1<<ev_pir1;
267 P2IFG &= ~BIT4; // Clear P2.4 IFG
270 irq_events |= 1<<ev_pir2;
271 P2IFG &= ~BIT5; // Clear P2.5 IFG
273 __bic_SR_register_on_exit(LPM0_bits); // Wake up