Миландр

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

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-авг-29 17:27 
Не в сети

Зарегистрирован: 2015-апр-21 15:20
Сообщения: 11
Вопрос задавать неудобно - вроде элементарный, но у меня полный "затык".
Решил реализовать тактовые импульсы для периферии на МК - прерываниями от таймера.
Код:

void TIMConfig()
{

TIMER2->CNTRL = 0x00000000;
//Настраиваем работу основного счетчика
TIMER2->CNT = 0x00000000;//Начальное значение счетчика
TIMER2->PSG = 0x00000000;//Предделитель частоты
TIMER2->ARR = 0x00000ffF;//Основание счета
TIMER2->IE = 0x00000002;//Разрешение генерировать прерывание при CNT = ARR
RST_CLK->TIM_CLOCK = (1<<25);// enable CLK of TIM2
RST_CLK->PER_CLOCK |=1<<15; //enable CLK of TIM2
TIMER2->CNTRL = 0x00000001;//Счет вверх по TIM_CLK. Разрешение работы таймера.
}

void TIMER2_Handler ()
{

PORTD->RXTX = 0xFFFF ;
PORTD->RXTX = 0 ;

}

При любых изменениях ARR - период срабатывания не изменяется (задумано - должны получатся импульсы через определённые периоды времени, которые можно регулировать ). Где ошибка?

Контроллер 1986ВЕ1Т, такт. частота 24МГц


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-авг-30 08:28 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 997
Откуда: Тула
void TIMConfig()
{
RST_CLK->TIM_CLOCK = (1<<25);// enable CLK of TIM2
RST_CLK->PER_CLOCK |=1<<15; //enable CLK of TIM2
TIMER2->CNTRL = 0x00000000;
//Настраиваем работу основного счетчика
TIMER2->CNT = 0x00000000;//Начальное значение счетчика
TIMER2->PSG = 0x00000000;//Предделитель частоты
TIMER2->ARR = 0x00000ffF;//Основание счета
TIMER2->IE = 0x00000002;//Разрешение генерировать прерывание при CNT = ARR

TIMER2->CNTRL = 0x00000001;//Счет вверх по TIM_CLK. Разрешение работы таймера.
}

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-авг-31 20:02 
Не в сети

Зарегистрирован: 2015-апр-21 15:20
Сообщения: 11
Спасибо за совет. Я нашёл ещё один ляп : в обработчике прерывания надо сбрасывать в регистре STATUS соответствующий бит. По ходу возник такой вопрос. При малых значениях регистра ARR период срабатывания таймера практически не изменяется. Изменения становятся заметны только при значениях ARR >= 0x00000030. В чём причина? Тактовая частота HCLK 24MHz.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-сен-01 08:39 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 997
Откуда: Тула
Потому, что на вход и выход из обработчика прерывания требуется по 10-15 тактов ядра, поэтому при такой большой частоте прерывания процессор только и успевает войти дернуть ногой и выйти, хотя сам запрос на прерывание приходит чаще.
ЗЫ. Это абсолютно бессмысленный режим, годный как раз только для того, чтобы понять, что прерывания тоже имеют цену (время на вход и выход) и что их частота должна быть как можно меньше.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-сен-01 09:45 
Не в сети

Зарегистрирован: 2015-апр-21 15:20
Сообщения: 11
Спасибо. Не подскажете, где ( в каком даташите) прописаны временнЫе характеристики ( сколько тактов выполняются инструкции ) МК серии 1986 ? Или же они типовые для Cortex (STM)? В даташите 1986ВЕ1Т я такого не нашёл.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-сен-01 10:09 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 997
Откуда: Тула
ARMv6-M Architecture Reference Manual

Cortex ™-M1 TechnicalReference Manual

ARM and Thumb-2 Instruction Set

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-сен-01 10:13 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 733
Откуда: АО "ПКК Миландр"
NikP писал(а):
Спасибо. Не подскажете, где ( в каком даташите) прописаны временнЫе характеристики ( сколько тактов выполняются инструкции ) МК серии 1986 ? Или же они типовые для Cortex (STM)? В даташите 1986ВЕ1Т я такого не нашёл.

Большинство инструкций выполняется за 1 такт (благодаря конвейеру), но условные инструкции (такие как CMP) могут выполняться за несколько тактов, так как необходимо заполнить конвейер ядра новыми инструкциями (если задержка Flash-памяти не равна 0, то ещё будут вставлены такты ожидания при чтении Flash-памяти). Есть также инструкции (например, STM) результат выполнения которых зависит от значений операндов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-сен-01 10:25 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 615
Откуда: г. Санкт-Петербург
NikP писал(а):
...
Решил реализовать тактовые импульсы для периферии на МК - прерываниями от таймера...

Для этих целей можно использовать один из каналов таймера в режиме ШИМ (например со скважностью 50%).
При этом прерывание от таймера можно не использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как настроить таймер МК 1986ВЕ1Т ?
СообщениеДобавлено: 2016-сен-01 11:24 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 997
Откуда: Тула
vasili писал(а):
NikP писал(а):
...
Решил реализовать тактовые импульсы для периферии на МК - прерываниями от таймера...

Для этих целей можно использовать один из каналов таймера в режиме ШИМ (например со скважностью 50%).
При этом прерывание от таймера можно не использовать.

Что-то я это просмотрел...
Код:
void timer3_init(void)
{ // TAKT GEN
    uint32_t temp;//, psg = 0;
      uint32_t ticks = SystemCoreClock/TAKT_FREQ_HZ;
    if(ticks < 2)
        ticks = 2;
      //psg = ticks >> 16;
      //ticks = ticks/(psg+1);

    temp = MDR_RST_CLK->TIM_CLOCK;
    temp &= ~(0xFF0000UL); // установка делителя для TIM3_CLK = HCLK/1
    temp |= (1 << 26);  // разрешение тактовой частоты TIM3_CLK_EN
    MDR_RST_CLK->TIM_CLOCK = temp;
   
    MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_PCLK_EN_TIMER3;
    MDR_TIMER3->CNTRL = 0;
    MDR_TIMER3->CNT =   0;
    MDR_TIMER3->PSG =   0;//psg; 32 битный таймер!
    MDR_TIMER3->ARR =   ticks;
    MDR_TIMER3->CCR1 =  ticks>>1;
    MDR_TIMER3->CH1_CNTRL = 7<<9;
      MDR_TIMER3->CH1_CNTRL1 = (2<<2) + 1;
    MDR_TIMER3->CNTRL = 1;
}

Не забудьте настроить ножку. Для 1986ве9х раскоментировать строки с psg.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB