Миландр

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

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




Начать новую тему  Ответить на тему  [ 8 сообщений ] 
Автор Сообщение
СообщениеДобавлено: 2015-янв-13 12:19 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-авг-14 16:20
Сообщения: 76
Откуда: г. Саратов
Здравствуйте. Столкнулся со следующей проблемой:
есть порт PC6, к которому припаян провод с некими тактовыми сигналами. Как сделать, чтобы по положительному фронту на этой ноге выполнять какие-либо действия? В описании порта, он может TMR3_CH3 и TMR1_CH2. Вроде как-то можно с помощью таймера обрабатывать внешние прерывания, но как именно, не могу понять.. Если у кого есть пример подобного деяния, то можете привести, буду очень благодарен:)

P.S. Вариант оторвать провод и припаять к к ноге с внешним прерыванием не приемлем.. Впринципе как и вариант, опрашивать ногу

_________________
Я Волшебник.


Вернуться к началу
СообщениеДобавлено: 2015-янв-13 13:31 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1530
Откуда: Тула
Kirra писал(а):
Здравствуйте. Столкнулся со следующей проблемой:
есть порт PC6, к которому припаян провод с некими тактовыми сигналами. Как сделать, чтобы по положительному фронту на этой ноге выполнять какие-либо действия? В описании порта, он может TMR3_CH3 и TMR1_CH2. Вроде как-то можно с помощью таймера обрабатывать внешние прерывания, но как именно, не могу понять.. Если у кого есть пример подобного деяния, то можете привести, буду очень благодарен:)

P.S. Вариант оторвать провод и припаять к к ноге с внешним прерыванием не приемлем.. Впринципе как и вариант, опрашивать ногу
Настроить канал таймера в режим "захват" и разрешить прерывание по этому каналу. Примеры есть на форуме в ветках про не работающие внешние прерывания.

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


Вернуться к началу
СообщениеДобавлено: 2015-янв-14 12:25 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-авг-14 16:20
Сообщения: 76
Откуда: г. Саратов
Примеров обработки прерывания с помощью таймера что-то не нашел (наверное искал не особо тщательно:)), и поэтому накидал код, почитав документацию. Но, к сожалению, он не работает.
Хочу с помощью TMR1_CH4 (это порт PC10) обработать прерывание. На PC10 припаян провод с кнопкой, при нажатии на которую в порт подается 1
*****
void gpio_init()
{
  ****
  RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
  port_init.PORT_FUNC = PORT_FUNC_OVERRID; /** test */
  port_init.PORT_MODE = PORT_MODE_DIGITAL;
  port_init.PORT_SPEED = PORT_SPEED_MAXFAST;
  port_init.PORT_OE = PORT_OE_IN;
  port_init.PORT_Pin = PORT_Pin_10;
  PORT_Init(MDR_PORTC, &port_init);
  ****
}

void timer_init(void)
{
  MDR_RST_CLK->PER_CLOCK |= 1 << 14; /** разрешение тактирования MDR_TIMER1 */
  MDR_RST_CLK->PER_CLOCK |= 1 << 16; /** разрешение тактирования MDR_TIMER3 */
  MDR_RST_CLK->TIM_CLOCK =( /** плак-смайл */
    0 /** делитель тактовой частоты MDR_TIMER1 */
    | (1 << 24) /** разешение тактирования MDR_TIMER1 */
    | (0 << 16) /** делитель тактовой частоты MDR_TIMER3 */
    | (1 << 26) /** разешение тактирования MDR_TIMER3 */
    );

  /** Режим захвата (для тестовой ноги с кнопкой) */
  MDR_TIMER1->CNTRL = 0x00000000; /** Режим инициализации таймера */

  /** Настраиваем работу основного счетчика */
  MDR_TIMER1->CNT = 0x00000000; /** Начальное значение счетчика */
  MDR_TIMER1->PSG = 0x00000000; /** Предделитель частоты */
  MDR_TIMER1->ARR = 0x000000FF; /** Основание счета */
  MDR_TIMER1->IE = 0x00001E00;  /** Разрешение генерировать прерывание
                                    * по переднему фронту на выходе CAP по  всем каналам */
  /** Режим работы каналов - захват */
  MDR_TIMER1->CH4_CNTRL = 0x00008003;

  /** Режим работы выхода канала – канал на выход не работает */
  MDR_TIMER1->CH4_CNTRL1= 0x00000000;
  MDR_TIMER1->CNTRL = 0x00000001; /** Счет вверх по TIM_CLK. Разрешение  работы таймера */
  NVIC_EnableIRQ(Timer1_IRQn);
}
*****
void Timer1_IRQHandler(void)
{
  ****
  код всякий
  ****

  MDR_TIMER1->CNT = 0x0000;
  MDR_TIMER1->STATUS &= ~(1 << 1);
  NVIC_ClearPendingIRQ(Timer1_IRQn);
}
но на нажатие кнопки, таймер ничего делать не хочет..
Скорее всего, я как-то неправильно настроил порт и/или таймер.
Как мне правильно настроить таймер? (порт, думаю, всё таки настроен правильно)

_________________
Я Волшебник.


Вернуться к началу
СообщениеДобавлено: 2015-янв-15 10:15 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 756
Откуда: г. Санкт-Петербург
Попробуйте так
void timer_init(void)
{
MDR_RST_CLK->PER_CLOCK |= 1 << 14; /** разрешение тактирования MDR_TIMER1 */
MDR_RST_CLK->PER_CLOCK |= 1 << 16; /** разрешение тактирования MDR_TIMER3 */
MDR_RST_CLK->TIM_CLOCK =( /** плак-смайл */
0 /** делитель тактовой частоты MDR_TIMER1 */
| (1 << 24) /** разешение тактирования MDR_TIMER1 */
| (0 << 16) /** делитель тактовой частоты MDR_TIMER3 */
| (1 << 26) /** разешение тактирования MDR_TIMER3 */
);

/** Режим захвата (для тестовой ноги с кнопкой) */
MDR_TIMER1->CNTRL = 0x00000000; /** Режим инициализации таймера */

/** Настраиваем работу основного счетчика */
MDR_TIMER1->CNT = 0x00000000; /** Начальное значение счетчика */
MDR_TIMER1->PSG = 0x00000000; /** Предделитель частоты */
MDR_TIMER1->ARR = 0x000000FF; /** Основание счета */
MDR_TIMER1->IE = 1<<8;
/** Режим работы каналов - захват */
MDR_TIMER1->CH4_CNTRL = 0x00008003;
MDR_TIMER1->CNTRL = 0x00000001; /** Счет вверх по TIM_CLK. Разрешение работы таймера */
NVIC_EnableIRQ(Timer1_IRQn);
}
*****
void Timer1_IRQHandler(void)
{
****
код всякий
****
MDR_TIMER1->STATUS &= ~( 1 << 8 ) ;
}


Вернуться к началу
СообщениеДобавлено: 2015-янв-16 13:19 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-авг-14 16:20
Сообщения: 76
Откуда: г. Саратов
Спасибо большое:) ваш код заработал, и очень мне помог:)

_________________
Я Волшебник.


Вернуться к началу
СообщениеДобавлено: 2015-янв-21 11:25 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-авг-14 16:20
Сообщения: 76
Откуда: г. Саратов
А как сделать, чтобы прерывание возникало при событии заднего фронта на CAP?
Просто в документации насчёт заднего фронта для входа ETR, а насчёт заднего фронта на CAP ничего не написано.
Использую вход порта PC6 (TMR3_CH3)

_________________
Я Волшебник.


Вернуться к началу
СообщениеДобавлено: 2015-янв-21 11:58 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 502
Цитата:
Просто в документации ...., а насчёт заднего фронта на CAP ничего не написано.
Смотрим описание регистра MDR_TIMERx->CHy_CNTRL2
биты 1…0 CHSEL1[1:0] Выбор события по входному каналу для CAP1
00 – положительный фронт по Chi;
01 – отрицательный фронт по Chi;

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

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


Вернуться к началу
СообщениеДобавлено: 2015-янв-28 09:22 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-авг-14 16:20
Сообщения: 76
Откуда: г. Саратов
редактор писал(а):
Смотрим описание регистра MDR_TIMERx->CHy_CNTRL2
биты 1…0 CHSEL1[1:0] Выбор события по входному каналу для CAP1
00 – положительный фронт по Chi;
01 – отрицательный фронт по Chi;
Спасибо большое! :)

Если я всё верно понял, то допустим, что на один таймер (например Timer1) заведены импульсы, по которым должны быть внешние прерывания по заднему фронту, пусть на ноги PC4 и PC6 (переопределенные функции TMR1_CH1 у PC4 и TMR1_CH2 у PC6). То прерывание void Timer1_IRQHandler(void){ ... } будет обрабатываться как по импульсу на PC4, Так и по импульсу на PC6?
И как правильно настроить таймер для обработки такой модели прерываний через standard-peripherals-library? Просто как настроить напрямую примерно знаю, но как настроить всё это дело через стандартную библиотеку от Миландра, к сожалению, я не знаю..
Как будет выглядеть такая модель прерываний через стандартную библиотеку от Миландра? Хотя бы примерно..

Очень надеюсь на вашу помощь.

_________________
Я Волшебник.


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

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


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

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


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

Перейти: 

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