Obdh Interrupts

The following code has been used to test interrupts on the board:

#include <io.h>
#include <signal.h>

/*
  Program to measure interrupt timings of the MSP430 board

  Finds an *upper limit* for the time it takes to enter an interrupt procedure

  Port 2 output is to be connected to Port 1 input
  Port 3 output is to be read by logic analyser

  By Pete R. Hague

  November 2009
*/

//Define sampling routine
int adcSample(char inchx, char srefx)
{
  int output;

  ADC12CTL0 |= (ADC12ON);

  ADC12MCTL0 = ((srefx<<4)+inchx); 
  ADC12CTL0 |= (ENC | ADC12SC);
  while (!(ADC12IFG & 0x1));
  output = ADC12MEM0;

  ADC12CTL0 &= ~ENC;

  ADC12CTL0 &= ~(REFON | ADC12ON);

  return output;
}

// Define interrupt vector
interrupt(PORT1_VECTOR) trigger(void) {
  adcSample(1,2);

  // Set Port 3 to high
  P3OUT=255;

  // Remove triggering condition
  P2OUT=0;

  // Reset Interrupt
  P1IE=255;
  P1IES=0;
  P1IFG=0;
}

// Main loop
int main() {
  int i;

  //P1DIR=0;
  //P1SEL=0;
  P1IE=255;
  P1IES=0;
  P1IFG=0;

  P3DIR=255;
  P3OUT=0;

  P2DIR=255;
  P2OUT=0;  

  P6SEL |= 0x80; 
  P6DIR |= ~0x80;

  ADC12CTL0=0xAA40; 
  ADC12CTL1=0x0200;
  ADC12IE=1; 

  eint();

  while(1) {
    // Set logic output low
    P3OUT=0;

    // Trigger Interrupt
    P2OUT=255;    

    // Waits to try interrupt again
    for (i=0;i<10000;i++)
      nop();
  }
}

When the output of Port 3 was measured on the logic analyser, the interrupt was found to take around 220 microseconds to complete. When calculating timings for the payload, add to this figure the length of time you would like the voltage sampled for (longer is more accurate, but also introduced the risk of the voltage changing).

Various configurations of the interrupt vector have been tried, with the best case time being 30 microseconds and the worst case time (including a full initialisation of ADC reference voltages) taking 20 milliseconds

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.