MSP 430G2553 Sampling in Compare Mode with Timer_A
===

I have to sample the input , every 14 microsecond in a 61 micro second slot with the timer input (Project Requirement).

I have to do it 8 times to make a byte. More like UART , but I am using it for One Wire Bus communication for my Masters Project.

I have written the code as below , which gives expected result, tested it executing one instruction at a time in debugger.

Below is the Code.

    /*****************************************************************************
    
    COMPARE MODE SAMPLING:
    
    
    MCLK and SCLK @8MZ
    
    The code configures P2.1  as TA1.CCI1A input.
    It samples the input at P2.1 Whenever the TA1R reaches the TA1CCR1 value.
    
    It samples input on P2.1 every 14us once in a duration of 61 us.
    
    It then reads 8 bits one by one to read a byte.
    
    ******************************************************************************/
    
    #include "io430g2553.h"
    
    #define MSP_DQ BIT5
    
    
    signed char word=0x00;
    
    
    
    signed char i=0;
    signed char temp;
    
    void Read(void)
    {
    
    TA1CCR0 = 0x1E8; //  61 micro secs
    
    
    
    
    TA1CCR1 = 0x70; // 14 micro secs
    
    //TA0CCTL1 = CM_2 | CCIS_0 | SCS | CAP | OUTMOD_0 | CCIE;
    //Keep in mind that It should not be configured as campture mode
    
    TA1CCTL1 |= CM_2 | CCIS_0 | SCS | OUTMOD_0 | CCIE;
    
    TA1CTL = TASSEL_2 + MC_1 + ID_0; // Register TA0CTL -> SMCLK/1, Up mode
    
    do{
    
    while ((TA1CCTL0 & CCIFG) == 0 ) // wait while CCIF is set
    {
    }
    
    (%1%)**TA1CCTL0 &= ~CCIFG; // Clear the flag**
    //TA1CTL &= ~TAIFG; // Clear the flag
    i++;
    } while( i<8) ;
    
    TA1CTL = TACLR; // Stop the Timer
    TA1CCTL1 = 0x00;
    
    }
    
    void Configure_CCI1A(void)
    {
    
    // Configuring P2.1 as TA1.CCI1A
    
    P2OUT &= 0x00; // Clearing P1OUT
    P2DIR &= ~BIT1 ; // Configuring P1.2 as input
    P2SEL |= BIT1 ; // P2.1 Timer1_A, capture: CCI1A input, compare: Out1 output
    P2SEL2 &= ~BIT1 ;
    
    
    }
    
    
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    
    BCSCTL1 = CALBC1_8MHZ;
    DCOCTL = CALDCO_8MHZ;
    
    P1OUT &= 0x00; // Clearing P1OUT
    P1DIR |= BIT0 ; // Configuring P1.0 as Output
    
    __enable_interrupt();
    
    Configure_CCI1A();
    Read();
    
    (%2%)**P1OUT ^= BIT0;**
    
    
    while(1) {
    
    }
    }
    
    
    // Timer A1 interrupt service routine
    #pragma vector=TIMER1_A1_VECTOR
    __interrupt void Timer1_A1 (void)
    {
    
    P1OUT ^= BIT0; // To show Read occured
    
    word <<=1; // If x = 00000010 (binary) => x <<= 2; => x=00001000
    temp=0x00;
    temp=((TA1CCTL1 & SCCI)>>10);
    **word = word + temp ;**
    
    }

But the issue is that when I call the function it some how appears stuck . I guess it is not coming out of the ISR cleanly though it completed all its execution when I run in debugger one instruction at a time. To make my question clear , This is how I tested :

Suppose if I put toggle break point at highlighted expression in ISR , then it enters the ISR hits the togglebreak 8 times capturing correct values and comes out of Read Function neatly ( and also

    while ((TA1CCTL0 & CCIFG) == 0 ) // wait while CCIF is set
    {
    } 
    
    and
    
    {
    
    ....
    
    ....
    
    i++;
    
    } while( i<8) ;

out of above loop)

, to reach while(1) expression in the mains.

But instead if i put toggle point at the highlighted expression (%1%)  it appears stuck.
OR if I put the toggle break point directly at (%2%) in main what i expect , it to complete the Read function , stores the value in word variable to reach the toggle break point but  the code appears stuck and does not hit the togglebreak. 

I do not know what is wrong, can any one please help ?
