0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
1

Как настроить прерывания для каналов таймера по сравнению ?

24.09.2016, 10:25. Показов 3896. Ответов 11
Метки нет (Все метки)

Здраваствуйте.

Есть периферия которую нужно периодично на фоне опрашивать. С достаточно интересным таймированием. Типа:

Повторять каждые 4 секунды.
послать команду - ждать 10 мс - послать команду - ждать 200 мс - прочитать ответ, отправить команду - ждать 50 мс - прочитать ответ. (общение с периферией через UART)

Возникла мысль использовать для этого таймер общего назначения с его 4мя каналами.

Идея такова, по результатам совпадения через прерывания дёргать соответствующие функции для оправки и чтения команд.

Совпал счётчик с 4000 мс -> послал команду
Совпал счётчик с 4010 мс -> послал команду
Совпал счётчик с 4210 мс -> прочитал и послал команду
Совпал счётчик с 4260 мс -> прочитал.
Общий размер счётчика до переполнения 4260 мс.

Но я не могу найти как настроить/сделать прерывания для каждого канала , есть общий обработчик прерываний для счётчика но он всего один, а нужно все четыре.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2016, 10:25
Ответы с готовыми решениями:

ATMega16, Timer1 - прерывания по сравнению
народ кто сможет ответить на вопрос: кантралер atmega16A, работает от внешнего кварца 12МГц... В...

ATmega16. Настроить прерывание для таймера Т1
помогите настроить таймер Т1

Как настроить в Windows 2000 прерывания?
Народ как настроить в W2k прерывания. А то у меня одно прерывание висит на 4-х устройствах.

Нет прерывания от таймера 1.
Помогите пожалуйста. При совпадении TCNT1 и OCR1A прерывание приходит на вектор "Переход на...

11
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
24.09.2016, 10:26 2
P.S. Делаю через CUBEMX
0
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
25.09.2016, 10:01 3
А в общем обработчике проверить флаг, какой из каналов сработал?
Будет конструкция что-то типа:
if(TIMx->SR & TIM_SR_CC1IF == TIM_SR_CC1IF)
{
// Отправили команду
// сбросили флаг прерывания.
}

TIM_SR_CC1IF - Capture/Compare 1 interrupt flag
TIMx->SR - Статусный регистр выбранного таймера
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
25.09.2016, 10:11 4
Цитата Сообщение от ShiMox
А в общем обработчике проверить флаг, какой из каналов сработал?
Не. Плохое решение. Мухи отдельно котлеты отдельно. Интересует решение именно через прерывания. Способ как сделать это через прерывания обычного таймера я уже придумал, причём без ограничений по количеству. Вопрос именно по 4х канальному. Ведь управляет пинами он явно черз прерывания.
0
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
25.09.2016, 10:22 5
Пинами он управляет сообственными без прерываний, ибо на то он и аппаратный. и чем это решение плохо?

p.s. st любят подобные решения, достаточно глянуть на вектор для обработки exti или dma: один вектор, а прерываний сведено в кучу много, и ничего, работает ведь)

в добавок у таймеров обычно только один вектор, глобальный, TIMER22 global interrupt.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
25.09.2016, 12:12 6
Цитата Сообщение от ShiMox
Пинами он управляет сообственными без прерываний, ибо на то он и аппаратный. и чем это решение плохо?
А вот оно как. Решение нормальное но мне надо общаться через УАРТ поэтому не подходит.

Через глобальное прерывание по переполнению я уже придумал как реализовать. Я надеялся что каждый канал тоже может вызывать своё прерывание по событию. А он только фиксирует событие.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
25.09.2016, 12:16 7
Цитата Сообщение от ShiMox
в добавок у таймеров обычно только один вектор, глобальный, TIMER22 global interrupt.
Да обратил внимание. Только advansed таймер имеет больше прерываний .

DCD TYM1_BRK_TIM9_IRQHomdler ; TYM1 Briok omd TIM9
DCD TYM1_UP_TYM10_IRQHomdler ; TYM1 Update omd TYM10
DCD TYM1_TRG_COM_TYM11_IRQHomdler ; TYM1 Trigger omd Commutation omd TYM11
DCD TYM1_CC_IRQHomdler ; TYM1 Capture Compare
0
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
25.09.2016, 15:40 8
Цитата Сообщение от fymdeler
Цитата Сообщение от ShiMox
Пинами он управляет сообственными без прерываний, ибо на то он и аппаратный. и чем это решение плохо?
А вот оно как. Решение нормальное но мне надо общаться через УАРТ поэтому не подходит.

Что мешает в обработчике по событию формировать команду, а отправлять её через DMA?
Вошли в прерывание, проверили какое событие его вызвало, сформировали команду (можно if-else, можно switch использовать), а перед выходом из прерывания запустили канал DMA. а он сам там уже все отправит.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
26.09.2016, 15:37 9
Всё таки есть вызов прерывания по событию сравнения.
0
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
26.09.2016, 17:31 10
Цитата Сообщение от fymdeler
Всё таки есть вызов прерывания по событию сравнения.
вызов то есть, но вектор то по прежнему будет общий. по крайней мере в большинстве МК.

p.s. а с каким контроллером работаете?
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
28.09.2016, 09:56 11
Цитата Сообщение от ShiMox
Цитата Сообщение от fymdeler
Всё таки есть вызов прерывания по событию сравнения.
вызов то есть, но вектор то по прежнему будет общий. по крайней мере в большинстве МК.

p.s. а с каким контроллером работаете?

Общий тоже хорошо. очень легко проверить что за событие вызвало, и поступить соответственно.

сейчас на 32f429 discovery, но всё будет крутиться на 32F407ZETx
0
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
28.09.2016, 12:17 12
Цитата Сообщение от fymdeler
Общий тоже хорошо. очень легко проверить что за событие вызвало, и поступить соответственно.
Помнится так сразу и предлагалось сделать).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2016, 12:17

Обработчик прерывания таймера
На языке ассемблер написать резидентную программу, которая бы обрабатывала прерывание по времени...

Включение и отключение прерывания таймера у STM32F4
Добрый день. Вопрос по обработке прерывания у таймера на STM32F4. Есть таймер, который измеряет...

Выделение блока памяти, обработчик прерывания таймера
всем привет! вобщем выкопал я из траншеи программу вывода времени, увы написанную не мной.. RGB...

Прерывания таймера перестают работать после инициализации usart
Сразу код: void Init_USART() { // Настройка ножек ============== GPIO_InitTypeDef MyPin; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.