/* * Program to solve Part 2 of Lab 6 * Use Input Capture 2 Interrupt to measure time between two falling edges */ #include <hc11.h> #define TRUE 1 int write_to_serial(unsigned short n); void tic2_isr(void); unsigned short first_edge; /* Time of first edge */ unsigned short second_edge; /* Time of second edge */ unsigned short which_edge; /* Used to let ISR know which time to set */ main() { TMSK2 = (TMSK2 | 0x03); /* 8 us clock to timer subsystem */ /* * Set up Input Capture 2 */ TCTL2 = (TCTL2 | 0x08) & ~0x04; /* Capture falling edge on TIC2 */ TIC2_JMP = JMP_OP_CODE; /* Set the TIC2 interrupt vector */ TIC2_VEC = tic2_isr; /* to point to the tic2_isr() routine */ TMSK1 = TMSK1 | 0x02; /* Set Bit 1 (IC2I bit) in TMSK1 */ /* to enable the TIC2 interrupt */ TFLG1 = 0x02; /* Clear TIC2 flag before enabling ints */ which_edge = 1; /* 1st time in interrupt, capture first edge */ /* * Done with Input Capture 2 setup */ enable(); /* Enable interrupts (clear I bit in CCR) */ while (TRUE) { if (which_edge == 3) /* Got both edges if which_edge == 3 */ { write_to_serial(second_edge - first_edge); /* Print time diff */ which_edge = 1; /* Next time in will be for first edge */ } } } #pragma interrupt_handler tic2_isr void tic2_isr(void) { if (which_edge == 1) /* Get time of first edge if which_edge == 1 */ { first_edge = TIC2; /* get time */ which_edge = 2; /* Next time will grab time of second edge */ } else if (which_edge == 2) /* Get time of second edge if which_edge == 2 */ { second_edge = TIC2; /* get time */ which_edge = 3; /* Tell main program time got both edges */ } TFLG1 = 0x02; /* Clear source of interrupt */ } /* Routine to write an integer to the serial port */ int write_to_serial(unsigned short n) { char i; unsigned char t,c[6]; for (i=3;i>=0;i--) { t = (n&0x0f); if (t < 10) c[i] = t + 48; else c[i] = t + 55; n = n >> 4; } c[4] = 0x0d; c[5] = 0x0a; for (i=0;i<6;i++) { while (!(SCSR&0x80)) ; SCDR = c[i]; } }