Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-янв-22 12:05

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 210 сообщений ]  На страницу « 1 2 3 4 514 »
Автор Сообщение
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-02 14:02 
Не в сети

Зарегистрирован: 2011-дек-27 08:33
Сообщения: 111
Откуда: АО "ПКК Миландр"
Хрущев Дмитрий писал(а):
Подскажите, пожалуйста, почему при записи в регистр CHx_CNTRL Таймера 1 бит CAPnPWM не устанавливается в 1. При выполнении кода
RST_CLK->PER_CLOCK |= RST_CLK_TIMER1_mask; /* Запуск Timer 1 */

TIMER1->CNT = 0; /* Обнуляем таймер */
TIMER1->PSG = 0; /* Нет делителя */
TIMER1->ARR = 0xFFFF; /* Счет по максимуму */
TIMER1->CNTRL = 0; /* Счет вверх на каждый такт, таймер выключен */
TIMER1->CH1_CNTRL = 0x8010; /* Событие по спаду CH1, режим захвата */
TIMER1->CH2_CNTRL = 0;
TIMER1->CH3_CNTRL = 0;
TIMER1->CH4_CNTRL = 0;
TIMER1->CH1_CNTRL1 = 0;
TIMER1->CH2_CNTRL1 = 0;
TIMER1->CH3_CNTRL1 = 0;
TIMER1->CH4_CNTRL1 = 0;
TIMER1->IE = 0x200; /* Прерывание по захвату */

RST_CLK->TIM_CLOCK = 0x1000000;
в регистре CH1_CNTRL остается число 0x10 вместо 0x8010.
Среда - Phyton CodeMaster ARM.
Ошибка в чипе, бит CAPnPWM всегда читается как "0", при этом запись идет нормально. Эта ошибка исправлена в новой ревизии, поставка которых только началась.


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-02 16:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1536
Откуда: Тула
ruslan.h писал(а):
Хрущев Дмитрий писал(а):
Подскажите, пожалуйста, почему при записи в регистр CHx_CNTRL Таймера 1 бит CAPnPWM не устанавливается в 1. При выполнении кода
RST_CLK->PER_CLOCK |= RST_CLK_TIMER1_mask; /* Запуск Timer 1 */

TIMER1->CNT = 0; /* Обнуляем таймер */
TIMER1->PSG = 0; /* Нет делителя */
TIMER1->ARR = 0xFFFF; /* Счет по максимуму */
TIMER1->CNTRL = 0; /* Счет вверх на каждый такт, таймер выключен */
TIMER1->CH1_CNTRL = 0x8010; /* Событие по спаду CH1, режим захвата */
TIMER1->CH2_CNTRL = 0;
TIMER1->CH3_CNTRL = 0;
TIMER1->CH4_CNTRL = 0;
TIMER1->CH1_CNTRL1 = 0;
TIMER1->CH2_CNTRL1 = 0;
TIMER1->CH3_CNTRL1 = 0;
TIMER1->CH4_CNTRL1 = 0;
TIMER1->IE = 0x200; /* Прерывание по захвату */

RST_CLK->TIM_CLOCK = 0x1000000;
в регистре CH1_CNTRL остается число 0x10 вместо 0x8010.
Среда - Phyton CodeMaster ARM.
Ошибка в чипе, бит CAPnPWM всегда читается как "0", при этом запись идет нормально. Эта ошибка исправлена в новой ревизии, поставка которых только началась.
А ещё, кажется, сперва надо включать тактирование на периферийные блоки, а потом их конфигурировать, т.е. строку
RST_CLK->TIM_CLOCK = 0x1000000;
желательно выставить сразу после
RST_CLK->PER_CLOCK |= RST_CLK_TIMER1_mask; /* Запуск Timer 1 */

_________________
сочувствующий…


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-24 13:41 
Не в сети

Зарегистрирован: 2012-июл-20 13:45
Сообщения: 2
Доброго времени суток. Задча измерить период входного сигнала. По восходящему фронту произвожу захват и сбрасываю таймер(Timer1, второй канал), значение CCR считаю периодом между восходящими фронтами. Проблема в следующем: при разрешении прерываний от других устройств значение в регистр сохраняется не корректно (ошибка довольно большая 7-8 младших разрядов"гуляют"). Когда разрешено прерывание только для Timer1 все работает как надо. Что я делаю не так?


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-24 14:09 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1315
Откуда: АО "ПКК Миландр"
Summer писал(а):
Доброго времени суток. Задча измерить период входного сигнала. По восходящему фронту произвожу захват и сбрасываю таймер(Timer1, второй канал), значение CCR считаю периодом между восходящими фронтами. Проблема в следующем: при разрешении прерываний от других устройств значение в регистр сохраняется не корректно (ошибка довольно большая 7-8 младших разрядов"гуляют"). Когда разрешено прерывание только для Timer1 все работает как надо. Что я делаю не так?
Похоже на ошибку 0015 в еррате. В кристаллах старше 1220 это исправлено, если установить в 1 четвертый бит в регистре CHy_CNTRL2. В более старых кристаллах следовать рекомендациям ерраты.


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-24 14:35 
Не в сети

Зарегистрирован: 2012-июл-20 13:45
Сообщения: 2
0015 Ошибочное формирование флага захвата CAP в блоке Timer
Описание:
При работе канала таймера в режиме захвата событие захвата и запись значения в регистр CCRх разнесены на один такт сигнала синхронизации TIM_CLK. В результате, если частота TIM_CLK много меньше рабочей частоты процессора HCLK может возникнуть ситуация, что программа определит факт возникновения события захвата, но из регистра ССR считает старое значение, так как оно там еще не обновилось.

1. Частота TIM_CLK равна рабочей частоте процессора
2. Сигнал на вход подается с внешнего генератора с фиксированной частотой, поэтому старое значение в регистре ССR не должно отличаться от нового


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-24 15:22 
Не в сети

Зарегистрирован: 2011-дек-27 08:33
Сообщения: 111
Откуда: АО "ПКК Миландр"
Summer писал(а):
Доброго времени суток. Задча измерить период входного сигнала. По восходящему фронту произвожу захват и сбрасываю таймер(Timer1, второй канал), значение CCR считаю периодом между восходящими фронтами. Проблема в следующем: при разрешении прерываний от других устройств значение в регистр сохраняется не корректно (ошибка довольно большая 7-8 младших разрядов"гуляют"). Когда разрешено прерывание только для Timer1 все работает как надо. Что я делаю не так?
При разрешении других прерываний возможна задержка при входе в прерывания Timer1 (даже если у него высокий приоритет), т.е. сброс таймера происходит не в один и тот же момент, что и вызывает джитер.
Надо не сбрасывать таймер, а каждый раз вычитать из нового захваченного значения старое.
uint16_t old_CCR2, faz;

void TIM1_IRQHandler (void)
{
    faz = TIMER1->CCR2 - old_CCR2;
    old_CCR2 = TIMER1->CCR2;
    TIMER1->STATUS = 0;
}



Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-июл-24 15:49 
Не в сети

Зарегистрирован: 2011-дек-27 08:33
Сообщения: 111
Откуда: АО "ПКК Миландр"
На форуме часто задавали вопрос как вызвать прерывание по определенному фронту внешнего сигнала, решением проблемы может быть использование таймера в режиме захвата. Для пояснения выкладываю пример для отладочной платы 1986ВЕ91Т. В примере 4-й канал теймера 1 настроен на захват событий: CAP - по положительному фронту, CAP1 - по отрицательному фронту. Событие от кнопки SEL.


Вложения:
CAP_example.rar [32.62 КБ]
904 скачивания
Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-сен-05 07:54 
Не в сети

Зарегистрирован: 2012-июл-19 07:20
Сообщения: 14
Добрый день!

Подскажите пожалуйста по поводу ШИМ/ЗАХВАТ.

Я правильно понимаю что для захвата события можно использовать только прямой канал?
Можно ли использовать только инверсный канал для вывода сигнала ШИМ, или обязательно и прямой нужно?

Например для 1986ВЕ92, вывод PE2 - захват TMR3_CH1, PE3 - ШИМ TMR2_CH3N


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-сен-05 08:18 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 505
Цитата:
Можно ли использовать только инверсный канал для вывода сигнала ШИМ, или обязательно и прямой нужно?
Для ШИМ можно использовать только инверсный.Проверено.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-сен-05 10:39 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1536
Откуда: Тула
AlexG писал(а):
Добрый день!

Подскажите пожалуйста по поводу ШИМ/ЗАХВАТ.

Я правильно понимаю что для захвата события можно использовать только прямой канал?
Можно ли использовать только инверсный канал для вывода сигнала ШИМ, или обязательно и прямой нужно?

Например для 1986ВЕ92, вывод PE2 - захват TMR3_CH1, PE3 - ШИМ TMR2_CH3N
вот только одновременно и захват и ШИМ на одном канале не получится.

_________________
сочувствующий…


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-окт-02 12:42 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Непонятки с таймером:
конфигурирую таймер:
TIMER3->CNTRL = 0; // таймер выключен
TIMER3->CNT = 0; // Обнулить таймер
TIMER3->PSG = 0x0; // делитель
TIMER3->CH3_CNTRL = 0x00008000; // Событие по по положительному фронту CH3, режим захвата
TIMER3->CH3_CNTRL1 = 0;
TIMER3->IE = 0x0008002; // Разрешено прерывание от CAP (канал CH3) и по окончанию счета
TIMER3->STATUS = 0; // сброс регистра статуса

RST_CLK->TIM_CLOCK = 0x4000000; /* Разрешение таковой частоты на TIM3 */

При выполнении функции:
void MeasureFunc(void)
{
CurrentMethod = MET_AND;
TIMER3->CNTRL = 0; /* таймер выключен */
TIMER3->CNT = 0; /* Обнуляем таймер */
TIMER3->ARR = 0x1FF; /* Счет по максимуму */
TIMER3->CNTRL = 1; /* Счет */

SYS->ICPR00 = 0xFFFFFFFF;
SYS->ISER00 = 0x00010000; /* Разрешение прерывания по TIM3 */
SysTickDelay(2000);
SYS->ICER00 = 0xFFFFFFFF; /* Сброс прерывания */
SYS->ICPR00 = 0xFFFFFFFF;
CurrentMethod = MET_OR;
}

/* Обработчик прерывания Timer1 */
void Timer3_IRQHandler(void)
{

Tm = TIMER3->CNT; /* Время прохождения */
SYS->ICER00 = 0xFFFFFFFF; /* Отключение прерывания по Timer 3 */
TIMER3->STATUS = 0;

sprintf(Tm_m,"%10d",Tm) ;
LCD_PUTS(30, 0, Tm_m);

}

При отсутствии захвата, таймер должен сформировать прерывание по заполнению, а следовательно ожидаю значение
Tm = 511 (1FF в TIMER3->ARR).
Вместо этого, при первом выполнении функции получаю 32
При последующих прохождениях - 42.
Что у меня не так сделано?

PS
до конфигурации таймера (и портов) выполняется код:

RST_CLK->HS_CONTROL = 0x01; // HSE ON - ON
while(RST_CLK->CLOCK_STATUS & 0x04 == 0);
RST_CLK->CPU_CLOCK = 0x102; // CPU_C1 - HSE, CPU_C2 - PLLCPU0
RST_CLK->PLL_CONTROL = 0x104; // PLL CPU & ON, koff = 2
while(RST_CLK->CLOCK_STATUS & 0x02 == 0);
RST_CLK->CPU_CLOCK = 0x106; // CPU_C1 - HSE, CPU_C2 - PLLCPU0
RST_CLK->PER_CLOCK = 0xFFFFFFFF; /* Разрешение тактирования периферии */


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-окт-02 13:56 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 756
Откуда: г. Санкт-Петербург
borisK писал(а):
Непонятки с таймером:
...Вместо этого, при первом выполнении функции получаю 32
При последующих прохождениях - 42.
Что у меня не так сделано?...
При возникновении прерывания по окончании счета, таймер сбрасывается в "0" и продолжает считать.
выполняя команду
Tm = TIMER3->CNT;
в функции обработки прерывания Вы читаете текущее содержимое счетчика таймера. Полученное значение зависит от времени реакции на прерывание.


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-окт-02 14:59 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Самой первой строкой в обработчик прерывания вставил

TIMER3->CNTRL = 0; /* таймер выключен */

Теперь значение получаю 30...31
Я так понимаю, что это связано с задержкой на остановку таймера?


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-окт-02 15:12 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Для проверки понизил частоту таймера делителем на 8

Значение стало 3...4, один раз даже 5 проскочило.
То есть действительно время в задержке.
Но почему она гуляет так сильно?
Можно ее как-то стабилизировать?


Вернуться к началу
 Заголовок сообщения: Re: Таймеры общего назначения
СообщениеДобавлено: 2012-окт-02 16:23 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 756
Откуда: г. Санкт-Петербург
borisK писал(а):
Для проверки понизил частоту таймера делителем на 8

Значение стало 3...4, один раз даже 5 проскочило.
То есть действительно время в задержке.
Но почему она гуляет так сильно?
Можно ее как-то стабилизировать?
Ну, не так уж и сильно. И зачем Вы хотите ее стабилизировать?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 210 сообщений ]  На страницу « 1 2 3 4 514 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB