Перейти к содержанию
    

Нужно таймером померять частоту( временные интервалы ) на " лапке " кто знает как это сделать подскажите

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно таймером померять частоту( временные интервалы ) на " лапке " кто знает как это сделать подскажите

В зависимости от диапазона измеряемой частоты решения могут быть различными.

Опишите задачу по-подробнее (частота от и до, точность, быстродействие), так и решение быстрее найдется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настраиваете тактирование таймера-счетчика и выбираете режим счета "вверх до переполнения" в регистре TA1CTL. Потом выбираете режим захвата, захват по нарастающему (или спадающему) фронту, синхронный захват в регистре TA1CCTLx. Запускаете таймер. Теперь по фронту сигнала на выводе CCIxA в регистре TA1CCRx будет защелкиваться значение таймера-счетчика и вызываться прерывание. При первом прерывании надо сбросить (и обнулить) таймер-счетчик и опять его запустить. При втором прерывании считать значение регистра TA1CCRx (это будет период сигнала на выводе CCIxA) и сбросить, обнулить, запустить опять таймер. И так далее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Настраиваете тактирование таймера-счетчика и выбираете режим счета "вверх до переполнения" в регистре TA1CTL. Потом выбираете режим захвата, захват по нарастающему (или спадающему) фронту, синхронный захват в регистре TA1CCTLx. Запускаете таймер. Теперь по фронту сигнала на выводе CCIxA в регистре TA1CCRx будет защелкиваться значение таймера-счетчика и вызываться прерывание. При первом прерывании надо сбросить (и обнулить) таймер-счетчик и опять его запустить. При втором прерывании считать значение регистра TA1CCRx (это будет период сигнала на выводе CCIxA) и сбросить, обнулить, запустить опять таймер. И так далее.

 

Сделал как ты сказал , заработало в прерывание попадаю , но вне зависимости от частоты заначение TAR счетного регистра одно и тоже

 

Вот моя настройка

 

{

TA1CCR0 = time;

TA1CCR2 =(unsigned int )time/2;

TA1CCTL2 = OUTMOD_4+CM_1+CCIE+CCIS1+SCS ;

TA1CTL = TASSEL_2| MC_1;

}

 

потом я попадаю в прерывание

 

 

#pragma vector=TIMER1_A1_VECTOR

__interrupt void Timer1_A1 (void)

{

uint16_t currentValue = TAR; // тут смотрю в дебагере значение счетчика

uint16_t currentValue = TA1CCR2;

 

}

значения TAR и TA1CCR2 почемуто от частоты не зависят

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал как ты сказал , заработало в прерывание попадаю , но вне зависимости от частоты заначение TAR счетного регистра одно и тоже

 

Вот моя настройка

 

{

TA1CCR0 = time;

TA1CCR2 =(unsigned int )time/2;

TA1CCTL2 = OUTMOD_4+CM_1+CCIE+CCIS1+SCS ;

TA1CTL = TASSEL_2| MC_1;

}

 

потом я попадаю в прерывание

 

 

#pragma vector=TIMER1_A1_VECTOR

__interrupt void Timer1_A1 (void)

{

uint16_t currentValue = TAR; // тут смотрю в дебагере значение счетчика

uint16_t currentValue = TA1CCR2;

 

}

значения TAR и TA1CCR2 почемуто от частоты не зависят

 

 

Ты забыл установить бит CAP в регистре TA1CCTL2 (режим захвата). В русском переводе даташита ошибка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поставил CAP теперь в прерывание не заходит :(

 

CCIS1 - что означает? Проверь, на какой вывод МК надо подавать сигнал. Регистры PxSEL, PxSEL2 как установлены?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void main(void)

{

unsigned int a=0;

 

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

{

P1SEL|=BIT6+BIT7;

P1SEL2|=BIT6+BIT7;

 

P2DIR &= ~(BIT2 | BIT3 | BIT4 | BIT5);

P2REN |= BIT2 | BIT3 | BIT4 | BIT5;

P2OUT |= BIT2 | BIT3 | BIT4 | BIT5;

P2SEL|=BIT5;

 

P3DIR &= ~(BIT0 | BIT1 | BIT2 | BIT4 | BIT5 | BIT6 | BIT7);

P3REN |= BIT0 | BIT1 | BIT2 | BIT4 | BIT5 |BIT7;

P3OUT |= BIT0 | BIT1 | BIT2 | BIT4 | BIT5 | BIT7;

 

 

Set_DCO();

 

}

__enable_interrupt();

 

ADC_init();

 

freq ( 100 );

while(1)

{

}

 

}

 

void freq (unsigned int time)

{

TA1CCR0 = time;

TA1CCR2 =(unsigned int )time/2;

TA1CCTL2 = OUTMOD_4+CM_1+CCIE+CCIS1+SCS ;

TA1CTL = TASSEL_2| MC_1;

}

 

#pragma vector=TIMER1_A1_VECTOR

__interrupt void Timer1_A1 (void)

{

uint16_t currentValue = TA1CCR2;

last =TA1R;

TA1R = 0;

old=last;

 

}

вроде все установлено

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void main(void)

{

unsigned int a=0;

 

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

{

P1SEL|=BIT6+BIT7;

P1SEL2|=BIT6+BIT7;

 

P2DIR &= ~(BIT2 | BIT3 | BIT4 | BIT5);

P2REN |= BIT2 | BIT3 | BIT4 | BIT5;

P2OUT |= BIT2 | BIT3 | BIT4 | BIT5;

P2SEL|=BIT5;

 

P3DIR &= ~(BIT0 | BIT1 | BIT2 | BIT4 | BIT5 | BIT6 | BIT7);

P3REN |= BIT0 | BIT1 | BIT2 | BIT4 | BIT5 |BIT7;

P3OUT |= BIT0 | BIT1 | BIT2 | BIT4 | BIT5 | BIT7;

 

 

Set_DCO();

 

}

__enable_interrupt();

 

ADC_init();

 

freq ( 100 );

while(1)

{

}

 

}

 

void freq (unsigned int time)

{

TA1CCR0 = time;

TA1CCR2 =(unsigned int )time/2;

TA1CCTL2 = OUTMOD_4+CM_1+CCIE+CCIS1+SCS ;

TA1CTL = TASSEL_2| MC_1;

}

 

#pragma vector=TIMER1_A1_VECTOR

__interrupt void Timer1_A1 (void)

{

uint16_t currentValue = TA1CCR2;

last =TA1R;

TA1R = 0;

old=last;

 

}

вроде все установлено

 

А на какой вывод сигнал подаешь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Р.2.5

 

Надо на вход захвата сигнал подавать. Посмотри на распиновку выводов (таблица 2 из даташита). CCI1A input - P1.2, CCI0A input - P2.0. ПОсмотри еще, что у тебя биты CCISx задают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо на вход захвата сигнал подавать. Посмотри на распиновку выводов (таблица 2 из даташита). CCI1A input - P1.2, CCI0A input - P2.0. ПОсмотри еще, что у тебя биты CCISx задают.

Выставлены правильно(CCI2B) это как бы проверял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выставлены правильно(CCI2B) это как бы проверял.

 

Можно попробовать отключить подтяжку от вывода P2.5.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно попробовать отключить подтяжку от вывода P2.5.

Делал не помогло.

У вас случаем нет примера рабочего такого типа (я понимаю что такая просьба наглость ,но.. ) просто все, что можно попробывал уже .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...