Skip to content

Instantly share code, notes, and snippets.

@jpwright
Created May 7, 2012 21:55
Show Gist options
  • Save jpwright/2630728 to your computer and use it in GitHub Desktop.
Save jpwright/2630728 to your computer and use it in GitHub Desktop.
MSP430 IR Detection
#include "msp430x22x4.h"
/*
Main program: entry point
*/
void delay (void)
{
int i;
i = 30000; // SW Delay
do i--;
while (i != 0);
}
int main (void)
{
int gothit = -1;
int i;
WDTCTL = WDTPW + WDTHOLD; /* turn off watchdog */
P1DIR |= 0x03; // set red and green led for output
P1REN |= 0x04; // connect resistor to switch
P2DIR |= 0x08;
P2OUT |= 0x08;
P2REN |= 0x16;
P1IE |= 0x04; // Enable switch as interrupt
P1IFG |= 0x04; // Set interrupt flag to 1 for switch
P1IES |= 0x04; // Set intterupt select high to low edge
//ADC stuff
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
TACCR0 = 30; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2 + MC_1; // TACLK = SMCLK, Up mode.
__bis_SR_register(CPUOFF + GIE); // LPM0, TA0_ISR will force exit
TACCTL0 &= ~CCIE; // Disable timer Interrupt
ADC10AE0 |= 0x01; // P2.0 ADC option select
P2OUT ^= 0x08;
__enable_interrupt(); // enable all interrupts
// while (1) {
// //P2OUT ^= 0x08; // Toggle P1.0 using exclusive-OR
//
// if (P2IN & 0x16) {
// P1OUT ^= 0x02;
// i = 10000; // SW Delay
// do i--;
// while (i != 0);
// }
// }
while(1) {
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
if (ADC10MEM < 0x3FC /*0x3E8*/) { // ADC10MEM = A0 > 1.65V?
P1OUT &= ~0x01; // Clear P1.0 LED off
P1OUT |= 0x02;
gothit++;
for (i = 0; i < gothit; i++) {
P1OUT |= 0x01; // Set P1.0 LED on
delay();
P1OUT &= ~0x01;
delay();
}
P1OUT &= ~0x02;
delay();
}
// } else {
// //P1OUT &= ~0x02;
// }
}
}
// Port 2 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P2OUT ^= 0x08; //Toggle laser state
P1IFG &= ~0x04; // Toggle interrupt edge
P1IES ^= 0x04;
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment