Уважаемые, коллеги, в продолжении начатой темы. Спасибо rezidentу, показал мне, где нужно читать внимательно. Но в ревизии D процессора эта ошибка будет исправлена.
Сейчас вход таймера конфигурируется для захвата и прерывания нормально идут, Но не пойму, почему в прерывании из TACCR0 вычитываются очень часто нули? Сигнал на входе таймера с переменной длительностью 50 - 150 мксек, тактирование таймера - 1 мГц. Почему нули в TACCR0, ведь между фронтами запуска таймера время на менее 40 мксек? Буду очень благодарен, если кто-нибудь мне подскажет.
Код
/****************************************************************************
Функция приема данных через 1-провoдный интерфейс
****************************************************************************/
unsigned int T_P [18];
unsigned char Rcv_HDQ (void)
{unsigned int Tick_W;
P1OUT |= BQ2016; // P1.1 Set HI
P1DIR &= ~BQ2016; // P1.1 Set as Input
P1SEL |= BQ2016; // P1.1 Set as CCIA input
Cnt_Bit =0;
Tick_W = Tick_ms + Lim_Wait_HDQ;
TAR = 0;
TACTL = TASSEL_2 + MC_1; // SMCLK = 1 mHz, up-mode
TACCTL0 = CM_3 + CAP + CCIE + SCS; // Capture on the both edge, CCIA + CCIFG
while ((Cnt_Bit != 16) && (Tick_W > Tick_ms)); // Ожидане окончания приема
CCTL0 &= ~CCIE; // CCR0 interrupt disabled
TACCTL0 = 0; // No Capture mode
P1SEL &= ~BQ2016; // P1.1 Set as GPIO input
if (Tick_W < Tick_ms) return (0); // если таймаут не исчерпан и получен ответ, то ошибки приема нет
else return (1); // в противном случае - ошибка приема
} // Rcv_HBQ (void)
// Timer A0 interrupt service routine
// State Mashine 1-Wire protocol
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
T_P [Cnt_Bit++] = TACCR0;
} // __interrupt void Timer_A (void)