GMVM 0 15 мая, 2011 Опубликовано 15 мая, 2011 (изменено) · Жалоба Здравствуйте!Пишу программу в которой используются 3 канала таймера. В прерывании анализирую флаги которые устанавливаются в SR.1 и 3 каналы установлены на захват, канал 2 на выходное сравнение. В процессе работы программы, канал 2 и 3 должны отключаться. Возникла проблема: я могу отключить их от прерываний, могу отключить выход 2 таймера, но флаги прерываний все равно устанавливаются. И тогда если я захожу в прерывание по 1-му каналу, то обрабатываются и остальные. Можно как-то отключать установку флагов или придется искать другой путь? вот код настройки таймера и упрощенное прерывание /*Конфигурация таймера TIM1*/ TIM1->PSC = 0x0; // установка делителя счетчика TIM1->ARR = 0xFFFF; //установка макс. значения регистра счетчика TIM1->CCMR1 &= ~TIM_CCMR1_CC1S; // отчищаем флаги TIM1->CCMR1 |= TIM_CCMR1_CC1S_0; // TIM1->CCMR1 &= ~TIM_CCMR1_IC1F; TIM1->CCMR1 |= (TIM_CCMR1_IC1F_2|TIM_CCMR1_IC1F_3); TIM1->CCER |= TIM_CCER_CC1P; TIM1->CCER &= ~TIM_CCMR1_IC1PSC; TIM1->CCER |= TIM_CCER_CC1E; TIM1->DIER |= TIM_DIER_CC1IE|TIM_DIER_UIE; //канал 2 TIM1->CCR2 = 0xFFE; //записываем значение в регистр сравнения TIM1->CCMR1|=(TIM_CCMR1_OC2M_0|TIM_CCMR1_OC2M_1); // устанавливаем выход таймера в режим переключателя TIM1->CCER|= TIM_CCER_CC2E; TIM1->DIER |= TIM_DIER_CC2IE; //канал 3 TIM1->CCMR2 &= ~TIM_CCMR2_CC3S; // отчищаем флаги TIM1->CCMR2 |= TIM_CCMR2_CC3S_0; // TIM1->CCMR2 &= ~TIM_CCMR2_IC3F; TIM1->CCMR2 |= (TIM_CCMR2_IC3F_2|TIM_CCMR2_IC3F_3); TIM1->CCER |= TIM_CCER_CC3P; TIM1->CCER &= ~TIM_CCMR2_IC3PSC; TIM1->CCER |= TIM_CCER_CC3E; TIM1->DIER |= TIM_DIER_CC3IE|TIM_DIER_UIE; TIM1->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE; // включаем счетчик, разрешаем авто-перезагрузку void TIM1_CC_IRQHandler(void) { if(TIM1->SR&TIM_SR_CC1IF) { TIM1->SR &=~TIM_SR_CC1IF; cc1++; } if(TIM1->SR&TIM_SR_CC2IF) { TIM1->SR &=~TIM_SR_CC2IF; cc2++; } if(TIM1->SR&TIM_SR_CC3IF) { TIM1->SR &=~TIM_SR_CC3IF; cc3++; } } Изменено 15 мая, 2011 пользователем IgorKossak сократил длинные строки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 15 мая, 2011 Опубликовано 15 мая, 2011 · Жалоба А чего там искать? Обычная практика маскировать unsigned int status=AT91C_BASE_US1->US_CSR; status&=AT91C_BASE_US1->US_IMR; А дальше работай со status точно так же как раньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GMVM 0 15 мая, 2011 Опубликовано 15 мая, 2011 (изменено) · Жалоба А, т.е это фактически нужно будет в прерывании заводить еще одно условие, в котором проверять отключены ли каналы от прерывания, и если отключены, то сбрасывать флаги этих прерываний? А вообще отменить установку флагов никак? Изменено 15 мая, 2011 пользователем GMVM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 15 мая, 2011 Опубликовано 15 мая, 2011 · Жалоба Зачем условие? Посмотри мой пример. Он от другой железки, но смысл не меняется. Накладываешь маску логическим AND и всё. Твоя задача только найти где взять эту маску. Либо она есть аппаратная в твоём чипе (кури даташит), либо переменную заведёшь под маску. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GMVM 0 15 мая, 2011 Опубликовано 15 мая, 2011 · Жалоба Все сообразил, спасибо) Жаль конечно что не отключить флаги, было бы проще) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GMVM 0 15 мая, 2011 Опубликовано 15 мая, 2011 (изменено) · Жалоба Что-то у меня не заладилось с таймером.Теперь такая проблема: настраиваю канал1 таймера 1 на выход с переключателем(toggle). Вроде все по даташиту TIM1->PSC = 7200-1; // установка делителя счетчика TIM1->ARR = 0xFFF; //установка макс. значения регистра счетчика TIM1->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE; // включаем счетчик, разрешаем авто-перезагрузку TIM1->CCR1 = 0xFFE; //записываем значение в регистр сравнения TIM1->CCMR1|=(TIM_CCMR1_OC1M_0|TIM_CCMR1_OC1M_1); // устанавливаем выход таймера в режим переключателя TIM1->CCER|= TIM_CCER_CC1E; , но на выходе ничего не происходит. Сигнал начинает идти только когда ставлю бит TIM_CCER_CC1E в ноль, а TIM_CCER_CC1P в единицу. по даташиту Bit 1 CC1P: Capture/Compare 1 output polarity CC1 channel configured as output: 0: OC1 active high 1: OC1 active low CC1 channel configured as input: This bit selects whether IC1 or IC1 is used for trigger or capture operations. 0: non-inverted: capture is done on a rising edge of IC1. When used as external trigger, IC1 is non-inverted. 1: inverted: capture is done on a falling edge of IC1. When used as external trigger, IC1 is inverted. Note:This bit is not writable as soon as LOCK level 2 or 3 has been programmed (LOCK bits in TIMx_BDTR register). Bit 0 CC1E: Capture/Compare 1 output enable CC1 channel configured as output: 0: Off - OC1 is not active. OC1 level is then function of MOE, OSSI, OSSR, OIS1, OIS1N and CC1NE bits. 1: On - OC1 signal is output on the corresponding output pin depending on MOE, OSSI, OSSR, OIS1, OIS1N and CC1NE bits. CC1 channel configured as input: This bit determines if a capture of the counter value can actually be done into the input capture/compare register 1 (TIMx_CCR1) or not. 0: Capture disabled. 1: Capture enabled т.е по идее я выключаю выходной сигнал а он наоборот появляется, причем таймер 5 с настройками выше работает как надо. Кто работал с этими таймерами подскажите в чем ошибка. Изменено 15 мая, 2011 пользователем GMVM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GMVM 0 16 мая, 2011 Опубликовано 16 мая, 2011 · Жалоба Разобрался)) Не был установлен бит MOE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться