Как работают прерывания таймера в режиме fast pwm с top = icrn?

Тема в разделе "Микроконтроллеры AVR", создана пользователем InterestedStudent, 10 окт 2021.

  1. Здравствуйте.
    Возник вопрос, как работаю прерывания таймера.

    Плата - 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, тут одни сомнения.

    Правильно ли понимаю работу прерываний таймера?
     
  2. parovoZZ

    parovoZZ Гуру

    только флаг прерывания таймера взведётся в следующим такте таймера, а не в момент совпадения.
     
    InterestedStudent нравится это.
  3. Правильно ли понял, это касается всех прерываний?

    И еще один вопрос, чем отличаются TIMER5_OVF_vect и TIMER5_CAPT_vect в данном режиме работы?
     
  4. Если правильно понимаю, то разницы между 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.
     
    Последнее редактирование: 10 окт 2021
  5. b707

    b707 Гуру

    Вообще-то эти прерывания не имеют ничего общего.
    TIMER5_OVF_vect - срабатывает тогда, когда счетчик таймера равен фиксированному значению Top

    TIMER5_CAPT_vect - это прерывание, которое сработает при событии INPUT_CAPTURE, если оно разрешено. - то есть когда на входном пине таймера появится поднимающийся или ниспадающий фронт сигнала. В этом случае текущее значение счетчика TCNT5 будет сохранено в регистр ICR5. и вызвано прерывание TIMER5_CAPT_vect
     
    InterestedStudent нравится это.
  6. Не совсем понимаю.

    Согласен.

    Тоже согласен, но для режима INPUT_CAPTURE, но как оно будет работать в режиме Fast PWM с TOP = ICRn?

    Сейчас в режиме Fast PWM с TOP = ICRn у меня вызываются оба прерывания.
    Но разница между ними какая-то есть, в каждом прерывании считаю кол-во вызовов, TIMER5_CAPT_vect вызывается на один раз больше, чем TIMER5_OVF_vect.
     
  7. b707

    b707 Гуру

    они у вас вызываются потому что вы выставили соответсвующий бит
    Код (C++):
    TIMSK5 = (1 << ICIE5) | (1 << TOIE5);
    если не путаю, когда вам не нужно прерывание TIMER5_CAPT_vect (а зачем оно вам в режиме PWM?) - просто не пишите единицу в бит ICIE5
     
    InterestedStudent нравится это.
  8. Да, оно не нужно, использовал его (менял в нем ICR5) пока не разобрался с прерыванием в этом режиме.

    Но появился интерес, что это такое и как это вообще работает в этом режиме.

    Похоже так и есть, чуть позже проверю.
     
  9. Да.

    И работаю они в данном режиме почти синхронно c TIMER5_OVF_vect.
    Но так как оно там не к месту, дальнейшие разбирательства решил отложить.

    Спасибо за помощь!