|
Цитата:
|
|
Уважаемый, а вы не путаетет архитектуры PIC с AVR? ))) в асинхронном режиме указан максимальный период счёта для TMR1 = 30 НАНОСЕКУНД.
|
Я?

Нет, не путаю. Мы сейчас говорим о контроллере
PIC16F877A, правильно, да? Ну дак ентож все верно... Мож я че не так сказал - писал быстро, с КПК, пока в метро опускался.
Максимальный период счета 30 нс? Где такой указан? Почему 133 МГц? Не врубаюсь, извините. Мы говорим вообще то о синхронном счете. Сейчас глянул - синхронизируется непосредственно от тактового генератора, а не от счетчика команд. Ну эт не так принципиально в этой задаче то.
yellow87, а теперь посчитай, на каких по счету импульсах срабатывает у тебя. Можешь использовать инструмент Counter Timer протеуса и возможность остановки в Breakpoints отладчика.
|
Цитата:
|
|
только непонятно, если вместо сигнального вывода(LED) использовать выход ССР(OUT), то моргания не наблюдается.
|
Проверь состояние регистра TRIS.
|
Цитата:
|
|
// T1_EXTERNAL_SYNC // тоже работает
|
Разумеется, поскольку после сброса предделитель таймера =1:1
Господа, вы, блин, че усложняете и без того
простую задачу то?
Если основываться на модуле CCP, то решается все одним модулем без проблем. Нет, ну если хочется, можно и двумя модулями - не возражаю. А если потребуется определить не 58-й и 74-й импульс, а штук 20 разных? 20 модулей, чтоль?
Просто предполагаем, что 58-й по счету придет раньше, чем 74-й

Разнице между ними - 16 импульсов.
Вначале, в тексте блока инициализации контроллера определяем режим работы модуля CCP1 и режим работы модуля TMR1, сбрасываем таймер, определяем маску разрешений прерываний.
Далее, в том месте программы, где нужно вести подсчет импульсов, устанавливаем регистр CCPR1L (используем только младший байт) на 58 и разрешаем работу таймера TMR1 - это и будет
"точкой отсчета".
При поступлении 58-го импульса от "точки отсчета", по событию сравнения сбрасывается таймер TMR1. В обработчике прерываний определяем, что сравнение произошло именно с величиной 58 в регистре CCPR1L и записываем новое значение в регистр CCPR1L. Значение равно 74-58=
16. То есть, 16 импульсов от 58-го до 74-го. Ну это то понятно? Выполняем какое-то действие по приходу 58-го импульса.
Выходим из обработчика прерываний, счет продолжается, приходит 74-й импульс, снова происходит событие сравнения.
Определяем, что сравнение было со следующей величиной (то есть, с 16, а не с 58 ), выполняем действие по приходу 74-го импульса и запрещаем работу таймера.
Всё, задача решена.
Вот код, во вложении, и там же проект в протеусе. Извини, код писал на ассемблере.
При поступлении 58-го импульса зажигается зеленый светодиод, при поступлении 74-го - красный.
Сообщение от ut1wpr
|
|
Но от какого считать? Маркер начала существует?
|
Да маркер начала, как отдельный элемент, не нужен. Это не принциписально для решения задачи. Маркером начала будет вызов подпрограммы подсчета импульсов, в начале которой будет разрешение работы таймера TMR1 (либо модуля CCP1). А каким способом и по какому событию вызывается эта подпрограмма - эт уж дело топикстартера.
|
Цитата:
|
|
Прежде чем советовать, вы бы в даташит глянули...
|

Я то глянул, а вот вы то недосмотрели. (могу точно так же "ответить") ЛОЛ.
Во-первых, фраза "Greater of:" переводится как "большее из:" То есть, 30 нс получится только при 20 МГц кварце контроллера и с предделителем 1:8 у таймера. TCY - это период иснтрукции.
А во-вторых, параметры 45-47 относятся к минимальной длительности сигнала, который вообще еще будет фиксироваться на входном предделителе. А приращение таймера произойдет по параметру 48 - только спустя минимум 2 периода тактового генератора.
То есть, это вовсе не означает, что TMR1 будет инкрементироваться с частотой 33 МГц.