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

 
 
> Вопрос по конфигурации входа на захват для 2012
Vladimir_T
сообщение Apr 19 2010, 05:38
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Уважаемые коллеги, подскажите, пожалуйста. Нужно мерить длительность импульса на ноге P1.1 (MSP430F2012) , самое простое - это подключить к нему таймер в режиме захвата CCI и захват делать по обоим фронтам. Но вход никак не конфигурируется, как CCIA , после инициализации он находится в третьем состоянии, хотя я его подтянул, все входные импульсы игнорирует. В чем может быть дело?
Код
/****************************************************************************
  Функция приема данных через 1-проводный интерфейс
****************************************************************************/
#define BQ2016   BIT1       // сигнал управления 1-проводным

unsigned char Init_HBQ (void)
{
  Flg_Rcv = true;
    
  P1OUT |= BQ2016;               // P1.1 Set HI    
  P1DIR &= ~BQ2016;              // P1.1 Set as Input
  P1REN |= BQ2016;                // P1.1 Pul Up Res
  P1SEL |= BQ2016;                 // P1.1 Set as CCIA input

  
  CCR0 = T_CYCH;                         // Data Hold
  TACTL = TASSEL_2 + MC_1;          // SMCLK = 1 mHz, up-mode
  TACCTL0 = CM_3 + CAP + CCIE;   // Capture on the both edge, CCIA + CCIFG
  
return 1;
} //
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Vladimir_T
сообщение May 12 2010, 07:03
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Уважаемые, коллеги, в продолжении начатой темы. Спасибо 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)
Go to the top of the page
 
+Quote Post
rezident
сообщение May 12 2010, 18:37
Сообщение #3


Гуру
******

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



Цитата(Vladimir_T @ May 12 2010, 13:03) *
Но не пойму, почему в прерывании из TACCR0 вычитываются очень часто нули?
Видимо потому, что вы используете таймер в режиме Up-mode, а хотели наверняка в режиме Continuous-mode. Либо Up-mode, но при этом следует использовать другой вход захвата, который связан с CCR1, а не с CCR0. И соответственно использовать другой вектор прерывания. Почитайте внимательно в User's Guide про режимы работы таймера.
Кроме того, вот здесь у вас потенциальная ошибка зарыта.
Цитата(Vladimir_T @ May 12 2010, 13:03) *
Код
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
      T_P [Cnt_Bit++] = TACCR0;  
} //  __interrupt void Timer_A (void)

Буферизация без явной проверки на выход за границы буфера это типовая ошибка и потенциальный глюкодром.
Go to the top of the page
 
+Quote Post
Vladimir_T
сообщение May 13 2010, 03:16
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Буферизация без явной проверки на выход за границы буфера это типовая ошибка и потенциальный глюкодром.
[/quote]

Спасибо за ответ. Но хотел пояснить почему нет проверки на выход за границы буфера: ответ от м/с BQ2016 по олнопроводному интерфейсу получаю байтом, который передается побитно. Количество фронтов получается аппаратно фиксировано, т.е. 8*2=16. Потому и не стал делать проверку. У меня так мало памяти осталось в проце, вот и стал экономить, а нужно еще функции анализа вставить.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:53
Рейтинг@Mail.ru


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