1) Можно ли в теле программы отключать таймеры,менять коэффициент предделителя, и включать таймеры когда нужно путем манипуляций с регистром TCCR? Или это можно сделать всего лишь раз при инициализации?
2)Что такое маска прерываний TIMSK??? Для чего это и как применять?
3) правильно ли я понял что регистр порога сравнения используется для вызывания прерывания, когда в регистре "натикает" то же число, которое я запишу в регистр совпадения?
1) Можно ли в теле программы отключать таймеры,менять коэффициент предделителя, и включать таймеры когда нужно путем манипуляций с регистром TCCR? Или это можно сделать всего лишь раз при инициализации?
Да, можно. Только обычно у каждого таймера свой управляющий регистр (TCCRn), иногда 2 (например TCCR1A, TCCR1B).
2)Что такое маска прерываний TIMSK??? Для чего это и как применять?
Маска прерываний разрешает(запрещает) соответсвующие прерывания от таймеров, чтобы разрешить прерывания нужно записать в соответствующий бит - 1, описание TIMSK (какие биты какое прерывание разрешают) см. даташит на Ваш контроллер
правильно ли я понял что регистр порога сравнения используется для вызывания прерывания, когда в регистре "натикает" то же число, которое я запишу в регистр совпадения?
В принципе правильно, флаг прерывания (например OCF0A) установится когда значение таймера (для данного примера число в регистре TCNT0) будет равным регистру сравнения (порога по-вашему). однако в случае конфигурирования таймера счетчика, как счетчика импульсов реистр сравнения выполняет несколько другую функцию (см. даташит)
Не сочтете за маразматика: ъ
(просто излагаю свои соображения))) )
Ограничений по работе с управляющими регистрами счетчиков, нет*.
Кроме количества времени, необходимых логике для срабатывания.
Есть ограничения на порядок считывания регистров счёта, сперва младший потом старший*.
Также, запускать(разрешать работу, запускать - не значит, что счёт пойдёт с нуля) счётчики, можно во входу Т0* и Т1* (external clock source).
Инициализация нужна для того, чтобы при включении и запуске МК все его схемы были подконтрольны и управляемы. При инициализации даже запрещается все прерывания(на Asm).
Маска прерываний - фильтр, через который будут проходит только нужные вам сигналы. К примеру чтобы счётчик после переполнения стартовал заново. С числа и направлением счёта указанных в управляющих регистрах.
Или при других событиях предложенных разработчиком МК. Например, при совпадении регистра счёта с регистром сравнения
Коэффициент предделителя частоты (стробирования) от задающего генератора МК постоянен и менять его(у вас(программистов)) нет возможности. Мы выбираем(открываем) поток/линию/канал от предделителя по которому будет осуществляться тактирование лог.схемы таймера.
Также есть регист прерываний(flag register - TIFR*), он даёт возможность считывания состояния процессов регистров счётчиков.
Процесс закончен(произошёл-флаг активирован) или выполняется(флаг-деактивирован)*.
*-конкретная модель МК.
Если я ошибся, по правьте или дополните.
Но только не говорите, что это не так.
Везде логика->ключи, транзисторы, вентили->и, или....
Токи, напряжения и скорости нарастания...
Последний раз редактировалось MetEl Вс июл 13, 2008 00:44:38, всего редактировалось 3 раза.
megasvintus писал(а):С
А что такое "захват таймером"? Что делает этот "захват" и с чем это едят. Можно поподробнее?
{jxe gjcjdtnjdf nm
Хочу посоветовать -http://www.gaw.ru/html.cgi/txt/doc/micr ... 8/10_2.htm
Для общего ознакомления (немного муторно...(( ).
Какой МК?
Описание блока захвата в составе МК М128 - http://www.gaw.ru/html.cgi/txt/doc/micr ... 10_0_4.htm
Используется альтернативная функция ножки МК под наименованием ICPn. Сравнивает логически... ((( типа работает с логическими уровнями, ну 0 или 1 (или по передниму фронт или заднему, как там придумано вощем....)
Последний раз редактировалось MetEl Вс июл 13, 2008 01:02:35, всего редактировалось 1 раз.
О чем речь то? Если о входном захвате (input capture), то здесь все просто. Когда-то, когда не было у МК модулей входного захвата/выходного сравнения временные интервалы от событий отсчитывались так - пришло событие (перепад на ногу например), затем мы копируем значение таймера в память, затем ждем, когда пройдет нужное время и тогда выставляем на нужной ноге нужный сигнал. И требуемый временной интервал увеличивается на время перехода в прерывание и все эти вычисления. Да и потом ядро постоянно отслеживает, сколько же у нас натикало, не пора ли...
Теперь все проще. Таймер считает, на какую-то ногу допустим пришел сигнал, по этому сигналу НЕМЕДЛЕННО в соотв регистр значение таймера в данный момент копируется и извещается ядро. Ядро смотрит - "Мамочки! Надо же от этого момента 23 такта отсчитать!", добавляет к времени, хранящемуся в регистре входного захвата 233 такта и кладет это число в регистр выходного сравнения. И ровно через 233 такта после поступления сигнала на ногу на другой ноге появится сигнал. Т.е. от скорости перехода в прерывание и скорости работы проги теперь ничего не зависит. Все операции по формированию временного интервала оказываются "внутри" этого интервала. Т.е. точность воспроизведения интервалов круто возрастает. Кроме того, ядро уже не отслеживает весь этот процесс после того, как в OCR запсиано нужное число.
Вопросы следующие:
1)В 16 разрядном таймере МЕГИ16 есть прерывания по совпадению с регистрами сравнения А и В, их можно включать одновременно. Это как работает?
Предположим в регистр А записали 259 а в регистр В 477, включили прерывания.
Таймер досчитал до 259
Зашли в функцию обработки прерывания по совпаденю с А
При выходе из функции автоматически сбрасывается флаг события и обнуляется таймер? Если так, то как он может досчитать до значения регистра В??? Разве что записать начальное значение в TCNT1 более 259 и запустить счет?
2) можно одновременно с этим еще добавить обработку прерываний по переполнению счетчика, как разрулить прерывания в этом случае, когда все в куче?
Если у кого есть время и желание: покажите на конкретном примере
3) как "рулить" прерываниями по отдельности в этом контроллере? В дш все по-английски, нормально перевести не получается
при "совпадении" счетчик таймера не обнуляется автоматически, если не включен режим CTC - Clear Timer on Compare (очистить при совпадении).
Если же вы включили этот режим - ваши проблемы, что до второго значения не досчитает - вы же программист!
прерывания "все в куче" не бывают. Если вдруг случится такое, что одновременно возникнет несколько условий для разных прерываний - выполнится только одно, самое приоритетное, а остальные будут ждать своей очереди. когда обработчик первого прерывания отработает - вызовется следующий по приоритету, и т.д.
не исключена ситуация, что низкоприоритетное прерывание никогда не обработается - если несколько высокоприоритетных следуют друг за другом слишком часто.
задача разработчика предусматривать все разумные варианты поведения программы, а значит - избегать ситуаций, требующих принудительного "разруливания"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Лучшим ответом на многие из этих вопросов будет проверка в симуляторе. Можно написать простенькие программки и повключать и поотключать таймеры-счётчики по ходу программы...
Например VMlab всё отлично видно, при медленном счёте можно увидить как счётчик считает заполняя регистр и сбрасывается от соответствующей команды.
// Timer1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
PORTB.7=~PORTB.7;// эта строчка нужна для того что-бы увидеть прерывание
}
while (1)
{
PORTB.0=~PORTB.0; // моргаем
delay_us(10); // светодиодом
}
}
В протеусе это выглядит так: РВ0 - радостно моргает,а РВ7 меняет уровень на высокий только раз и не реагирует на ICP никак.В чем ошибка не пойму?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
А зачем ICR1 сделан верхним пределом счёта таймера? В нем же как раз фиксируется значение TCNT при захвате. Может в этом проблема?
upd: Как раз в этом и проблема. Читай внимательно даташит!!! (стр 111):
When the ICR1 is used as TOP value (see description of the WGM13:0 bits located in
the TCCR1A and the TCCR1B Register), the ICP1 is disconnected and consequently
the Input Capture function is disabled.
А по русски: когда ICR1 используется как верхний предел счета TCNT, вход ICP1 отсоединён и функция захвата отключена.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.