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

 
 
> Чудуса msp430f2252 Timer_A в режиме выдачи импульсов, При увеличении частоты на выходе фронт расщепляется!
progvlad
сообщение Oct 24 2008, 14:40
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 24-10-08
Пользователь №: 41 156



Использовал пример. Частотата внешнего кварца 8 Мгц. Необходимо сформировать аппаратно на пине процессора 130 кГц.


Выполнил настройку таймера и источника тактовых сигналов. До частот ~40-50 кГц - нормальный меандр на выходе. Но при частотатах выше - полные чудеса: фронты расщепляются на импульсы и на других незадействованных выходах появляются импульсы от задействованного таймера.

// P1.1/TA0|--> TACCR0
// P1.2/TA1|--> TACCR1
// P1.3/TA2|--> TACCR2



// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
TACCR0 += 200; // Add Offset to TACCR0
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch (TAIV) // Efficient switch-implementation
{
case 2: TACCR1 += 1000; // Add Offset to TACCR1
break;
case 4: TACCR2 += 10000; // Add Offset to TACCR2
break;
case 10: P1OUT ^= 0x01; // Timer_A3 overflow
break;
}
}


Как лечить не знаю. Пришлось программно выполнить формирование 130 кГц.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Oct 28 2008, 10:43
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вобщем, соптимизировал слегка.
Код
interrupt (TIMERB0_VECTOR) Timerb_ccr0(void)
{
    //PulseRecharge();
    TBCCR2 = TBCCR0 + 20u;//HalfPeriod;                // Обозначили следующий фронт Gen
    TBCCR0 = TBCCR2 + 20u;//HalfPeriod;            // Будущий спад сигналов Gen и F
    TBCCR1 = TBCCR2 + 4u;//FDelay;                // Фронт F
}

По TBCCR2 встаёт 1-й фронт, по TBCCR1 с небольшой задержкой - 2й.
По TBCCR0 оба падают. Использую OUTMODE_3 (Установка/сброс).
Листинг:
Код
    23fa:    0f 12           push    r15    ;
    23fc:    1f 42 92 01     mov    &0x0192,r15;0x0192
    2400:    3f 50 14 00     add    #20,    r15;#0x0014
    2404:    82 4f 96 01     mov    r15,    &0x0196;
    2408:    1f 42 96 01     mov    &0x0196,r15;0x0196
    240c:    3f 50 14 00     add    #20,    r15;#0x0014
    2410:    82 4f 92 01     mov    r15,    &0x0192;
    2414:    1f 42 96 01     mov    &0x0196,r15;0x0196
    2418:    2f 52           add    #4,    r15;r2 As==10
    241a:    82 4f 94 01     mov    r15,    &0x0194;
    241e:    3f 41           pop    r15    ;
    2420:    00 13           reti

Эффект ещё забавнее.
1 круг таймера (15мс) идёт частота 100кГц, дальше ещё круг - тишина.
На другом выходе (который с задержкой) идут одиночные импульсы 4мкс через 15мс.

В общем, чудеса.


В общем, в данной ситуации вижу только один выход.
Сажать скоростной выход на отдельный таймер (А) без всяких прерываний.
А остальные, менее скоростные - на таймер В в непрерывном режиме с прерываниями.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 28 2008, 14:41
Сообщение #3


Гуру
******

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



Цитата(MrYuran @ Oct 28 2008, 15:43) *
В общем, в данной ситуации вижу только один выход.
Сажать скоростной выход на отдельный таймер (А) без всяких прерываний.
А остальные, менее скоростные - на таймер В в непрерывном режиме с прерываниями.
Выход гораздо прозаичнее. Нужно разделить запись нового значения регистра сравнения и вычисление следующего значения (полу)периода. Сначала запись, затем вычисление.
Код
#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TimerA0_ISR(void)
{ static unsigned short newReg=HALFPERIOD*2;
  TACCR0=newReg;
  newReg+=HALFPERIOD;
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 07:31
Рейтинг@Mail.ru


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