AVR - запретить работу таймера на время обработки прерывания

Тема в разделе "WASM.ELECTRONICS", создана пользователем Quark, 27 янв 2009.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    собственно вопрос. можно ли как-то запретить изменение регистра-счётчика на время обработки прерывания или же необходимо сохранять значение этого регистра при входе в обработчик и восстанавливать перед выходом из него? можно, также, при заходе в обработчик запрещать работу таймера, но флага, отвечающего за это я не нашёл. единственное - установить делитель частоты равный нулю (CS = 0: No clock source. (Timer/Counter stopped)).
    контроллер - восьмая мега.
     
  2. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    +1
    Другого варианта нет.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Quark
    Если нужно остановить\приостановить то конечно (CS = 0: No clock source. (Timer/Counter stopped)) только непонятно зачем это делать на время обработки прерывания - чтобы время работы кода прибавлялось к периоду тамера? :))
     
  4. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Это, конечно, минус. дело в другом. представь: у тебя OCR1B и OCR1A отличаются на единицы, а прерывания нужно ловить от обоих. сработало прерывание compare_b, а через несколько тактов должно сработать compare_a, но оно не срабатывает, т.к. в это время идёт обработка compare_b.
     
  5. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Есть такая штука как отложенное прерывание.
    Как только выйдешь из compare_b сразу попадешь compare_a.
    Задержка есть.
     
  6. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Пардон за невежество, но на AVR нельзя послать сигнал EOI как на пк?
     
  7. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Да. Спасибо за совет.

    Прошу прощения, нужно было пояснить более подробно. Вобщем задача сгенерировать 8 шимов. Я делаю примерно так: создаю массив времён для каждого канала. в OCR1A период срабатывания. OCR1B постоянно меняю в обработчике cmpB (устанавливаю новое минимальное значение).

    получается так. срабатывает handler_cmpA - все каналы устанавливаются в 1. устанавливаю в OCR1B минимальное время из массива. при срабатывании handler_cmpB - устанавливаю следующее минимальное время из массива и сбрасываю в 0 все каналы, времена которых меньше TCNT1. и т.д. 7 раз.

    проблема. если значения в массиве идут слишком часто. например, сработало t1, я записываю в OCR1B t2. разница между ними несколько единиц - значит для t2 таймер уже не сработает, т.к. на момент записи TCNT1 может быть уже больше, чем OCR1B.
    Другого выхода, кроме как остановить счётчик на время выполнения handler_cmpB я не вижу. что опять-же вносит большую погрешность.
     
  8. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    А если увеличить период ШИМ (до критического значения)? Ну если можно.
    Поставить значение предделителя побольше. И тогда на один такт счетчика будет приходится достаточное количество тактов для обслуживания прерывания. IHMO

    Vov4ick
    Из PDF-ника. Там пишут, что есть отложеные прерывания. Нужно будет заняться этим вопросом.
    Или я не так понял?