示例#1
0
__interrupt void ButtonPortIsr(void)
{
  unsigned char ButtonInterruptFlags = BUTTON_PORT_IFG;
  unsigned char StartDebouncing = 0;
    
  for (unsigned char i = 0; i < NUMBER_OF_BUTTONS; i++)
  {
    /* if the button bit position is one then determine 
     * if the button should be masked 
     */
    unsigned char temp = (ButtonInterruptFlags & (1<<i)) & ~GetAbsoluteButtonMask(i);
    
    if ( temp )
    {
      if ( ButtonData[i].BtnState == BUTTON_STATE_OFF )
      {
        ButtonData[i].BtnState = BUTTON_STATE_DEBOUNCE; 
      }
      StartDebouncing = 1;
    }
  }
  
  BUTTON_PORT_IFG = 0;

  if(StartDebouncing)
  {
    RouteCommandFromIsr(ButtonDebounce);
    EXIT_LPM_ISR();
  }

}
示例#2
0
__interrupt void RTC_ISR(void)
{
	unsigned char ExitLpm = 0;

  // compiler intrinsic, value must be even, and in the range of 0 to 10
  switch(__even_in_range(RTCIV,0xa))
  {
  case RTC_NO_INTERRUPT: break;
  case RTC_RDY_IFG:      break;
  case RTC_EV_IFG:       break;
  case RTC_A_IFG:        break;

  case RTC_PRESCALE_ZERO_IFG:	// 128Hz
	  ExitLpm |= Timer_Interrupt(1);
    break;

  case RTC_PRESCALE_ONE_IFG:	// 1Hz
	  ExitLpm |= Timer_Interrupt(0);
    break;
  
  default:
    break;
  }

  if ( ExitLpm )
  {
    EXIT_LPM_ISR();
  }
}
示例#3
0
__interrupt void isrAnalogToDigital(void)
{
	ADC12IV = 0;	// We should only ever get an expected interrupt

	if (HandleResult(currentRequest))
	{
		EXIT_LPM_ISR();
	}
	currentRequest++;
	if (currentRequest >= MAX_REQUESTS)
		currentRequest = 0;
	Launch(currentRequest);
}
示例#4
0
__interrupt void DebugUartIsr(void)
#endif
{
  unsigned char ExitLpm = 0;
  
  // Vector 2 - RXIFG; Vector 4 - TXIFG
  switch (__even_in_range(UCA3IV, 4))
  {
  case 2: ExitLpm = TermModeIsr();
  default: break;
  }
  
  if (ExitLpm) EXIT_LPM_ISR();
}
示例#5
0
__interrupt void RTC_ISR(void)
{
  unsigned char ExitLpm = 0;
  tMessage Msg;
        
  // compiler intrinsic, value must be even, and in the range of 0 to 10
  switch(__even_in_range(RTCIV,10))
  {
  case RTC_NO_INTERRUPT: break;
  case RTC_RDY_IFG:      break;
  case RTC_EV_IFG:       break;
  case RTC_A_IFG:        break;

  case RTC_PRESCALE_ZERO_IFG:

    // divide by four to get 32 Hz
    if (DivideByFour >= 4-1)
    {
      DivideByFour = 0;
           
      if (RtcInUseMask & RTC_TIMER_VIBRATION) VibrationMotorStateMachineIsr();
      
      if (RtcInUseMask & RTC_TIMER_BUTTON)
      {
        SetupMessage(&Msg, ButtonStateMsg, MSG_OPT_NONE);
        SendMessageToQueueFromIsr(DISPLAY_QINDEX, &Msg);
        ExitLpm = 1;
      }
    }
    else
    {
      DivideByFour ++;
    }
    break;

  case RTC_PRESCALE_ONE_IFG:
    
#ifdef DIGITAL
    ExitLpm |= LcdRtcUpdateHandlerIsr();
#endif
    
    ExitLpm |= OneSecondTimerHandlerIsr();
    break;
  
  default:
    break;
  }

  if (ExitLpm) EXIT_LPM_ISR();
}
__interrupt void TIMER0_B0_ISR(void)
{
  NumberOfFastPulses--;

  if(0 == NumberOfFastPulses)
  {
    // Disable timer B0 interupts
    TB0CCTL0 &=~ CCIE;
    // Restore normal divider
    TB0CCR0 = ( ANALOG_DISP_TIMER_DIVIDER - 1);
  }

  // Exit LPM3 on interrupt exit (RETI).  
  EXIT_LPM_ISR();
  
}
__interrupt void TIMER0_A1_VECTOR_ISR(void)
{
	unsigned char ExitLpm = 0;
  
  /* callback when timer expires */
  switch(__even_in_range(TA0IV,0xE))
  {
  case 0: break;                  
  case 2: ExitLpm = pCrystalCallback1(); RemoveUser(1); break;
  case 4: ExitLpm = pCrystalCallback2(); RemoveUser(2); break;
  case 6: ExitLpm = pCrystalCallback3(); RemoveUser(3); break;                         
  case 8: ExitLpm = pCrystalCallback4(); RemoveUser(4); break;                         
  default: break;
  }
  
  if ( ExitLpm )
  {
    EXIT_LPM_ISR();  
  }
}
示例#8
0
__interrupt void DebugUartIsr(void)
#endif
{
  unsigned char ExitLpm = 0;
  
  switch(__even_in_range(UCA3IV,4))
  {
  case 0:break;                             // Vector 0 - no interrupt
  case 2:                                   // Vector 2 - RXIFG
    ExitLpm = RxTestModeCharacterIsr(UCA3RXBUF);
    break;
    
  case 4:break;                             // Vector 4 - TXIFG
  default: break;
  }
  
  if ( ExitLpm )
  {
    EXIT_LPM_ISR();  
  }
}
示例#9
0
__interrupt void isrDMA(void)
{
	int index;
	switch (__even_in_range(DMAIV, 16))
	{
		case DMAIV_DMA0IFG:
			index = 0;
			break;
		case DMAIV_DMA1IFG:
			index = 1;
			break;
		case DMAIV_DMA2IFG:
			index = 2;
			break;
		default:
			return;	// Don't continue
	}
	if (dmaCallbacks[index](index))
	{
		EXIT_LPM_ISR();
	}
}
__interrupt void TIMER0_A1_VECTOR_ISR(void)
{
  unsigned char ExitLpm = 0;
  
  /* callback when timer expires */
  switch(__even_in_range(TA0IV,8))
  {
  /* remove the user first in case the callback is re-enabling this user */
  case 0: break;                  
  case 2: RemoveUser(1); ExitLpm = pCrystalCallback1(); break;
  case 4: RemoveUser(2); ExitLpm = pCrystalCallback2(); break;
  case 6: RemoveUser(3); ExitLpm = pCrystalCallback3(); break;
  case 8: RemoveUser(4); ExitLpm = pCrystalCallback4(); break;
  default: break;
  }
  
  if ( ExitLpm )
  {
    EXIT_LPM_ISR();  
  }
  
}