Страница 1 из 1
6 программных, независимых друг от друга таймеров в Atmega8
Добавлено: Чт сен 10, 2009 14:27:53
kybertech
Народ подскажите кто сталкивался с такой задачей:
- Как на основе одно системного таймера в МК Atmega8 или Atmega16 можно создать 6 и более независимых друг от друга таймеров. У кого какие есть идеи по этому поводу ? А может кто и владеет таким куском программы. Да забыл сказать - пишу на С.
заранее спасибо!
Добавлено: Чт сен 10, 2009 14:41:39
ARV
это элементарная задача, если, конечно, вам не нужно высокой частоты срабатывания ваших "виртуальных" таймеров. просто создаете массив значений, с которыми сравниваете текущее значение счетчика таймера в прерывании таймера и при совпадении вызываете определенную функцию или что-то там нужное делаете.
Добавлено: Чт сен 10, 2009 16:34:28
kybertech
ARV писал(а):это элементарная задача, если, конечно, вам не нужно высокой частоты срабатывания ваших "виртуальных" таймеров. просто создаете массив значений, с которыми сравниваете текущее значение счетчика таймера в прерывании таймера и при совпадении вызываете определенную функцию или что-то там нужное делаете.
допустим совпало первое значение в масиве и начался выполняться кусок программы по условию. Таким образом выполнение таймера приостанавливается на время пока выполниться действие. А это уже и есть зависимость таймеров друг от друга. Или я не прав ?
Попроавте если не прав.
Добавлено: Чт сен 10, 2009 17:03:29
Pooher
. Таким образом выполнение таймера приостанавливается на время пока выполниться действие.
Можно, и даже нужно, не "выполнять действие", в смысле некую подпрограмму, а выставлять флаг наступления события, и обрабатывать его (флаг) в главном цикле.
Добавлено: Чт сен 10, 2009 17:34:15
Aheir
Продолжая предыдущую мысль:
...тогда, если не использовать в "подпрограммах" запреты прерываний, Ваши таймеры будут существенно более независимы
Добавлено: Чт сен 10, 2009 17:37:25
Synergetik
Интересная тема. Присоединяюсь.
Pooher писал(а):Можно, и даже нужно, не "выполнять действие", в смысле некую подпрограмму, а выставлять флаг наступления события, и обрабатывать его (флаг) в главном цикле.
Допустим, сработал флаг. Началось выполнение подпрограммы. Тогда в определённых её точках (где нужна продолжительная монополизация ЦП) нужно вызывать выполнение подпрограммы, проверяющей совпадение? И есть вероятность пропустить нужный номер импульса, пока выполняются определённые куски (даже всякие там проверки if занимают время). Хотя можно проверять не на точное совпадение, на интервал +/-, который, допустим, определяется величиной epsilon.
В любом случае сброс по таймеру происходит программно, а не аппаратно, что грузит ЦП. Наверное, именно это имел в виду AVR, говоря
если, конечно, вам не нужно высокой частоты срабатывания ваших "виртуальных" таймеров
Так, мысли вслух. Если мыслю неправильно, надеюсь, умные коты меня поправят.
Хотя остаётся вопрос: когда сбрасывать аппаратный таймер, по которому работают остальные?
Добавлено: Чт сен 10, 2009 18:18:05
ARV
во-первых, традиционно вопрос задан так, что отвечающим больше гадать приходится, чем давать нормальные советы.
во-вторых, если надо, то можно и флаги ставить, можно и функции вызывать, можно и контексты задач переключать - все можно. но вопрос "нужно ли?" остается открытым.
так как таймеры программные, как ни крути, процессор они грузить будут.
истинного параллелизма вы не получите и с кучей аппаратных таймеров - прерывание в любой момент только одно обслуживается. если начнете разрешать прерывания до завершения текущего обработчика - запросто можете получить кучу гемора... тут надобно уменье
однако меня очень интересует: зачем может понадобиться куча таймеров? просто любопытно...
Добавлено: Чт сен 10, 2009 18:30:43
Pooher
Всё зависит от задачи, выполняемой контроллером. Но одно можно сказать точно: абсолютно любая задача в пределах этой темы решаема на 100%. Просто такие вещи надо делать под конкретную задачу.
Добавлено: Чт сен 10, 2009 22:32:44
GNN
Я конечно не телепат, но наверное дело касается трехфазного тиристорного привода, где нужно раздельно управлять углом открывания тиристоров каждого полупериода - итого 6 полупериодов.
Я как-то выкладывал тут в разделе литературы ссылки 2х книжек об этом по теме "СИФУ на AVR".
Добавлено: Пт сен 11, 2009 11:22:52
kybertech
GNN писал(а):Я конечно не телепат, но наверное дело касается трехфазного тиристорного привода, где нужно раздельно управлять углом открывания тиристоров каждого полупериода - итого 6 полупериодов.
Я как-то выкладывал тут в разделе литературы ссылки 2х книжек об этом по теме "СИФУ на AVR".
Прямо в дырочку попал )
Вчера вроде как разобрался с этим делом. Сдвиг нормальный по фазам при определенной частоте сети. Теперь хочу сюда прицыпить регулятор частоты.
Добавлено: Пт сен 11, 2009 18:26:28
maglev
Я может не в тему, но в более удобной mega48/88/168 шесть прерываний и шесть выходов OCR-ов, вполне независимых.
Я в одном похожем макете использовал такое, хотя потом отказался по другим причинам.