Миландр
http://forum.milandr.ru/

как настроить таймер МК 1986ВЕ1Т ?
http://forum.milandr.ru/viewtopic.php?f=22&t=3541
Страница 1 из 1

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

Вопрос задавать неудобно - вроде элементарный, но у меня полный "затык".
Решил реализовать тактовые импульсы для периферии на МК - прерываниями от таймера.
Код:

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МГц

Автор:  prostoRoman [ 2016-авг-30 08:28 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

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. Разрешение работы таймера.
}

Автор:  NikP [ 2016-авг-31 20:02 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

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

Автор:  prostoRoman [ 2016-сен-01 08:39 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

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

Автор:  NikP [ 2016-сен-01 09:45 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

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

Автор:  prostoRoman [ 2016-сен-01 10:09 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

ARMv6-M Architecture Reference Manual

Cortex ™-M1 TechnicalReference Manual

ARM and Thumb-2 Instruction Set

Автор:  Petr [ 2016-сен-01 10:13 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

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

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

Автор:  vasili [ 2016-сен-01 10:25 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

NikP писал(а):
...
Решил реализовать тактовые импульсы для периферии на МК - прерываниями от таймера...

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

Автор:  prostoRoman [ 2016-сен-01 11:24 ]
Заголовок сообщения:  Re: как настроить таймер МК 1986ВЕ1Т ?

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.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/