реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Timer A в режиме захвата
Pavel V.
сообщение Jul 28 2007, 14:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Пытаюсь запустить таймер в режиме захвата. Возникло несколько вопросов.

Мне нужно ловить сигнал логического "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)?

Спасибо!


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 28 2007, 14:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



То, что видно с первого взгляда - все регистры PXSEL в нулях.
И похоже, мало Вы даташит курили, еще нужно.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Pavel V.
сообщение Jul 28 2007, 14:39
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Да, это я уже заметил и исправил. Но все равно не работает. Так что вопрос все еще в силе.


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 28 2007, 15:10
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



См. внимательно таблицу 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;
в процедуре обработчика прерывания.
Go to the top of the page
 
+Quote Post
Pavel V.
сообщение Jul 28 2007, 15:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Итак, у меня что-то заработало 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 контроллер виснет.. Что я неправильно делаю?


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 28 2007, 16:01
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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;
   }
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 15:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016