Здравствуйте. Возник вопрос, как работаю прерывания таймера. Плата - Arduino Mega 2560R3 (Atmega2560), таймер T5. Настройки таймера в режим Fast PWM с TOP = ICRn Код (C++): TCCR5A = 0; TCCR5B = 0; TCCR5A |= (1 << WGM51) | (0 << WGM50); TCCR5B |= (1 << WGM52) | (1 << WGM53); ICR5 = 0; OCR5A = 8; TCCR5A |= (1 << COM5A1) | (1 << COM5A0); TCCR5B |= (0 << CS52) | (0 << CS51) | (0 << CS50); TIMSK5 = (0 << ICIE5) | (0 << TOIE5); Запуск таймера. Код (C++): TIMSK5 = (1 << ICIE5) | (1 << TOIE5); ICR5 = 1200 TCCR5B |= (1 << CS51); Сейчас в голове следующее: TIMER5_COMPA_vect сработает когда TCNT5 будет равен OCR5A, TIMER5_COMPB_vect сработает когда TCNT5 будет равен OCR5B, TIMER5_COMPC_vect сработает когда TCNT5 будет равен OCR5C, TIMER5_OVF_vect сработает когда TCNT5 будет равен ICR5. TIMER5_CAPT_vect при данных настройках сработает когда TCNT5 будет равен ICR5, тут одни сомнения. Правильно ли понимаю работу прерываний таймера?
Правильно ли понял, это касается всех прерываний? И еще один вопрос, чем отличаются TIMER5_OVF_vect и TIMER5_CAPT_vect в данном режиме работы?
Если правильно понимаю, то разницы между TIMER5_OVF_vect и TIMER5_CAPT_vect в данном режиме нет. Источник - http://microsin.net/programming/avr/atmega32-16-bit-timer-counter1.html, после Рис. 19-7. Диаграмма времени Fast PWM Mode. Или тут - https://ww1.microchip.com/downloads...r-atmega640-1280-1281-2560-2561_datasheet.pdf, 147стр., под рисунком Figure 17-7. Fast PWM Mode, Timing Diagram.
Вообще-то эти прерывания не имеют ничего общего. TIMER5_OVF_vect - срабатывает тогда, когда счетчик таймера равен фиксированному значению Top TIMER5_CAPT_vect - это прерывание, которое сработает при событии INPUT_CAPTURE, если оно разрешено. - то есть когда на входном пине таймера появится поднимающийся или ниспадающий фронт сигнала. В этом случае текущее значение счетчика TCNT5 будет сохранено в регистр ICR5. и вызвано прерывание TIMER5_CAPT_vect
Не совсем понимаю. Согласен. Тоже согласен, но для режима INPUT_CAPTURE, но как оно будет работать в режиме Fast PWM с TOP = ICRn? Сейчас в режиме Fast PWM с TOP = ICRn у меня вызываются оба прерывания. Но разница между ними какая-то есть, в каждом прерывании считаю кол-во вызовов, TIMER5_CAPT_vect вызывается на один раз больше, чем TIMER5_OVF_vect.
они у вас вызываются потому что вы выставили соответсвующий бит Код (C++): TIMSK5 = (1 << ICIE5) | (1 << TOIE5); если не путаю, когда вам не нужно прерывание TIMER5_CAPT_vect (а зачем оно вам в режиме PWM?) - просто не пишите единицу в бит ICIE5
Да, оно не нужно, использовал его (менял в нем ICR5) пока не разобрался с прерыванием в этом режиме. Но появился интерес, что это такое и как это вообще работает в этом режиме. Похоже так и есть, чуть позже проверю.
Да. И работаю они в данном режиме почти синхронно c TIMER5_OVF_vect. Но так как оно там не к месту, дальнейшие разбирательства решил отложить. Спасибо за помощь!