Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Timer A в режиме захвата
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Pavel V.
Пытаюсь запустить таймер в режиме захвата. Возникло несколько вопросов.

Мне нужно ловить сигнал логического "0". Т.е. на входе постоянно присутствует "1", и проскакивает кратковременный "0". Я так понимаю, мне нужен захват по заднему фронту?

МК - MSP430F1232

Прикладываю свой код:

Код
#include <io430x12x2.h>

unsigned int speed=0;

void main(void)
{
  init_PORTS();
  init_TA();
  __enable_interrupt();
  
  for (;;) {

    itoa1(speed); // int to char
    display(); // динамическая индикация
    
  }
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
  speed = TACCR0;
}

void init_PORTS(void)
{
  P1DIR = 0xFF; // 0 - input; 1 - output
  P1OUT = 0xFF; // 0 - low; 1 - high
  P1SEL = 0x00; // 0 - i/o; 1 - function
  
  P2DIR = 0x00;
  P2OUT = 0x00;
  P2SEL = 0x0C; // P2.2 P2.3 - capture
  
  P3DIR = 0x0E;
  P3OUT = 0x00;
  P3SEL = 0x00;
}

void init_TA(void)
{
  TACCTL0 = CM_2 + SCS + CCIS_1 + CAP + CCIE; // задний фронт, синхронный захват, вход CCIxB, захват, прерывание
  TACTL = TASSEL_2 + MC_2;                  // SMCLK + Continuous Mode
}


Почему-то прерывания не происходит. Подозреваю, что напутал либо с инициализацией таймера, либо с тактовыми сигналами. Систему тактирования не настраиваю, по умолчанию ведь используется DCO с частотой около 800 кГц?

Пробовал подавать сигнал на ноги P2.2/TA0/A2 и P2.3/TA1/A3/VREF−/

И еще вопрос - прерывание должно возникать при возникновении сигнала по обоим ногам (CCI0B и CCI1B)?

Спасибо!
Dog Pawlowa
То, что видно с первого взгляда - все регистры PXSEL в нулях.
И похоже, мало Вы даташит курили, еще нужно.
Pavel V.
Да, это я уже заметил и исправил. Но все равно не работает. Так что вопрос все еще в силе.
rezident
См. внимательно таблицу Timer_A3 Signal Connections в datasheet msp430f1232.pdf. Входными сигналами для регистра захвата CCR0 могут быть P1.1 (CCI0A) и P2.2 (CCI0B). Сигнал от P2.3 это CCI1B для CCR1. Кроме того, у вас выбран режим синхронного захвата (бит SCS в TACCTL0), поэтому длительность входного импульса должны быть не меньше периода одного импульса от источника тактирования TACLK=SMCLK для вашего случая. Чтобы проверить корректность работы программы, можете симмитировать захват программно. Для этого достаточно инвертировать бит CCIS0 в TACCTL0. Бит CCIS1 должне быть сброшен.
Код
TACCTL0^=CCIS0;
TACCTL0^=CCIS0;
После этого обязательно должно возникнуть прерывание, которые вы легко отловите в отладчике, установив breakpoint на
Код
speed = TACCR0;
в процедуре обработчика прерывания.
Pavel V.
Итак, у меня что-то заработало smile.gif Прерывание теперь возникает. Но почему-то работает только если инициализировать генератор от ВЧ кварца:

Код
void init_XT(void) // high frequenz resonators ( 455 kHz - 8MhZ )
{
  unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  BCSCTL1 |= XTS;                       // ACLK = LFXT1 = HF XTAL
  do
  {
    IFG1 &= ~OFIFG;                     // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);         // Time for flag to set
  }
  while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?                
  BCSCTL2 |= SELM_3 + SELS;             // MCLK = LFXT1 (safe), SMCLK = LFXT1CLK
}


Если же этого не делать, то прерывания нет. Наверняка я что-то недопонял с источниками тактирования таймера, но вот что именно?

И второй вопрос - мне необходимо производить захват по двум входам от одного таймера.

Сейчас делаю вот так:

Код
void init_TA(void)
{
  TACTL = TASSEL_1 + ID_3 + MC_2 + TACLR;           // ACLK + Continuous Mode
  TACCTL0 = CM_2 + SCS + CCIS_1 + CAP + CCIE; //  CCIxB + Capture Mode + Interrupt
  TACCTL1 = CM_2 + SCS + CCIS_1 + CAP + CCIE; //  CCIxB + Capture Mode + Interrupt
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
  speed = TACCR0;
}

#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1 (void)
{
  speed = TACCR1;
}


Но при входном воздействии на CCI1B контроллер виснет.. Что я неправильно делаю?
rezident
Цитата(Pavel V. @ Jul 28 2007, 21:43) *
Но при входном воздействии на CCI1B контроллер виснет.. Что я неправильно делаю?

Опять User Manual не "докурили" smile.gif
По поводу источников тактирования читайте соответствующий раздел его
http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/4.htm
По поводу таймера. Вектор TIMERA1_VECTOR имеет три источника прерывания и отдельный регистр прерываний TAIV. Поэтому процедура обработки прерывания должны выглядеть так.
Код
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1 (void)
{ switch(TAIV)
   { case 0x02:
        speed = TACCR1;
        break;
      case 0x04:
      case 0x0A:
      default:
        break;
   }
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.