2

Friends , 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


unsigned char word=0x00;



unsigned char i=0;
unsigned 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
{
}

**TA1CCTL0 &= ~CCIFG; // Clear the flag** (%1%)
//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();

**P1OUT ^= BIT0;** //(%2%)


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 ;** //(%3%)

}

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 (%3%) 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 , store 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 ?

Gaurav K
  • 2,864
  • 9
  • 39
  • 68

1 Answers1

3

The interrupt flag is automatically cleared when you read TAIV or if you manually clear it in TACCTL1. However, you do neither of these things in your ISR so the interrupt remains pending and your CPU continually executes your ISR and no other code so it never gets a chance to exit Read().

My guess is that by putting a breakpoint in the ISR your development environment causes a read from TAIV and clears the pending interrupt. I've experienced that before, but not sure how common that behaviour is as it is undesirable.

tinman
  • 6,348
  • 1
  • 30
  • 43
  • Thanks .. Tinman .. I figured that out reading John Davies's Book Yesterday... Adding TA1CCTL1 &= ~CCIFG; in the ISR made it come out of ISR. This is what you have suggested as well. Cheers – Gaurav K Jul 30 '12 at 10:02