Миландр https://forum.milandr.ru/ |
|
Использование таймера для обработки внешнего прерывания https://forum.milandr.ru/viewtopic.php?f=33&t=2346 |
Страница 1 из 1 |
Автор: | Kirra [ 2015-янв-13 12:19 ] |
Заголовок сообщения: | Использование таймера для обработки внешнего прерывания |
Здравствуйте. Столкнулся со следующей проблемой: есть порт PC6, к которому припаян провод с некими тактовыми сигналами. Как сделать, чтобы по положительному фронту на этой ноге выполнять какие-либо действия? В описании порта, он может TMR3_CH3 и TMR1_CH2. Вроде как-то можно с помощью таймера обрабатывать внешние прерывания, но как именно, не могу понять.. Если у кого есть пример подобного деяния, то можете привести, буду очень благодарен:) P.S. Вариант оторвать провод и припаять к к ноге с внешним прерыванием не приемлем.. Впринципе как и вариант, опрашивать ногу |
Автор: | prostoRoman [ 2015-янв-13 13:31 ] | |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания | |
Здравствуйте. Столкнулся со следующей проблемой:
Настроить канал таймера в режим "захват" и разрешить прерывание по этому каналу. Примеры есть на форуме в ветках про не работающие внешние прерывания.
есть порт PC6, к которому припаян провод с некими тактовыми сигналами. Как сделать, чтобы по положительному фронту на этой ноге выполнять какие-либо действия? В описании порта, он может TMR3_CH3 и TMR1_CH2. Вроде как-то можно с помощью таймера обрабатывать внешние прерывания, но как именно, не могу понять.. Если у кого есть пример подобного деяния, то можете привести, буду очень благодарен:) P.S. Вариант оторвать провод и припаять к к ноге с внешним прерыванием не приемлем.. Впринципе как и вариант, опрашивать ногу |
Автор: | Kirra [ 2015-янв-14 12:25 ] |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания |
Примеров обработки прерывания с помощью таймера что-то не нашел (наверное искал не особо тщательно:)), и поэтому накидал код, почитав документацию. Но, к сожалению, он не работает. Хочу с помощью 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); } Скорее всего, я как-то неправильно настроил порт и/или таймер. Как мне правильно настроить таймер? (порт, думаю, всё таки настроен правильно) |
Автор: | vasili [ 2015-янв-15 10:15 ] |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания |
Попробуйте так 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 ) ; } |
Автор: | Kirra [ 2015-янв-16 13:19 ] |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания |
Спасибо большое:) ваш код заработал, и очень мне помог:) |
Автор: | Kirra [ 2015-янв-21 11:25 ] |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания |
А как сделать, чтобы прерывание возникало при событии заднего фронта на CAP? Просто в документации насчёт заднего фронта для входа ETR, а насчёт заднего фронта на CAP ничего не написано. Использую вход порта PC6 (TMR3_CH3) |
Автор: | редактор [ 2015-янв-21 11:58 ] | |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания | |
Просто в документации ...., а насчёт заднего фронта на CAP ничего не написано.
Смотрим описание регистра MDR_TIMERx->CHy_CNTRL2 биты 1…0 CHSEL1[1:0] Выбор события по входному каналу для CAP1 00 – положительный фронт по Chi; 01 – отрицательный фронт по Chi; |
Автор: | Kirra [ 2015-янв-28 09:22 ] | |
Заголовок сообщения: | Re: Использование таймера для обработки внешнего прерывания | |
Смотрим описание регистра 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? Просто как настроить напрямую примерно знаю, но как настроить всё это дело через стандартную библиотеку от Миландра, к сожалению, я не знаю.. Как будет выглядеть такая модель прерываний через стандартную библиотеку от Миландра? Хотя бы примерно.. Очень надеюсь на вашу помощь. |
Страница 1 из 1 | Часовой пояс: UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |