Вопрос

Друзья, я должен попробовать ввод, каждые 14 микросекунд в слот 61 микро второго с входом таймера (требование к проекту).

Я должен сделать это 8 раз, чтобы сделать байт. Больше похоже на UART, но я использую его для одной проволочной автобусной связи для проекта My Masters.

Я написал код, как показано ниже, что дает ожидаемый результат, протестировал его выполнять одну инструкцию одновременно в отладчике.

ниже код.

/*****************************************************************************

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%)

}
.

Но вопрос заключается в том, что когда я вызываю функцию, это некоторые, как выглядят застряли. Я думаю, что он не выходит из ISR чисто, хотя он завершил все свое исполнение, когда я запускаю в отладчик на одну инструкцию одновременно. Чтобы сделать мой вопрос чистым, вот как я проверял:

Предположим, если я поставлю точку перерыва перерыва в выделенном выражении (% 3%) в ISR, то он входит в ISR, попадает в игру в поместье 8 раз, захватывая правильные значения и выходит из функции чтения (а также

while ((TA1CCTL0 & CCIFG) == 0 ) // wait while CCIF is set
{
} 

and

{

....

....

i++;

} while( i<8) ;
.

вне приведенной выше цикла)

, чтобы достичь (1) выражения в сети.

Но вместо этого, если я поставлю точку переключения в выделенном выражении (% 1%), оно кажется застрявшим. Или, если я поставив точку перерыва перерыва непосредственно в (% 2%) в основной то, что я ожидаю, это завершить функцию чтения, хранить значение в переменной слова, чтобы достичь точек перерыва Toggle, но код выглядит застрял и не попадает в переключать.

Я не знаю, что не так, может кто-нибудь, пожалуйста, помогите?

Это было полезно?

Решение

Флаг прерывания автоматически очищается при прочитании Taiv или вручную очистить его в Tacctl1.Тем не менее, вы не делаете ни одно из этих вещей в вашем ISR, поэтому прерывание остается в ожидании ожидания, и ваш ЦП постоянно выполняет ваш ISR и другой код, поэтому он никогда не получает шанс выйти из GeneracodicTagcode.

Я предполагаю, что, поместив точку останова в ISR вашей среде разработки, вызывает чтение от Taiv и очищает от ожидаемого прерывания.Я испытал это раньше, но не уверен, насколько распространено, что поведение так, как нежелательно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top