Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Ну что-ж, из Вашего вопроса не совсем понятно что вы хотите.
Попробую угадать и задать вопрос себе сам вместо Вас подробнее.
В меге128 разрядности одного 16-разрядного счетчика мне не
достаточно для определения момента возникновения какого-то
события. Было-бы не плохо каскадировать два (1-й и 3-й) счетчики
для этой цели. У кого есть какие-нибудь соображения, как это сделать?
Теперь буду высказывать свои соображения.
То что вы предлагаете скорее всего не самый простой вариант.
Понятно, что старшие(хотя-бы однин старший) разряды младшего
счетчика должны перыкрываться с младшими(хотя-бы одним младшим
разрядом) старшего счетчика.
В момент возникновения события мы получаем два 16-
битных значения регистров захвата ICR3 и ICR1.
Тогда для получения результирующего значения необходимо:
-если перыкрывающиеся разряды ICR младшего и старшего счетчиков
равны, то к 16 разрядам младшего счетчика дописиваем оставшиеся
(неперыкрывающиеся) разряды ICR старшего счетчика;
-если перыкрывающиеся разряды ICR младшего и старшего счетчиков
неравны, то к 16 разрядам младшего счетчика дописиваем оставшиеся
(неперыкрывающиеся) разряды ICR старшего счетчика, предварительно
увеличенного на единицу програмно.
Обеспечивать такое перекрытие придется скорее-всего програмно.
Можно наверное сделать так: аппаратно соединить (и настроить для таковой
работы) выход OC1B и вход T3. Как только после прохождения TCNT1 значения
OCR1B равного 0x7FFF выход OC1B перейдет в "лог.0", значение TCNT3
увеличится на "1" (с досадным опозданием конечно, возможно от этого опоздания можно вообще избавиться подкорректировав соответствующие значения OCR1B). Тут-же обработчик
прерывания TIMER1_COMPB должен подготовить очередное увеличение на "1"
значения TCNT3. А именно перевести выход обратнов "лог.1" (
при помощи FOC1B), в OCR1B загрузить 0xFFFF. Дальше все
аналогично. При этом, за за один период TCNT1, TCNT3 увеличится на "1"
дважды и в нужные моменты, что и требовалось. Правда перекрывающиеся
разряды могут быть и не в фазе, тогда придется выдать лишний импульс
для фазировки.
Таким образом получится 31-разрядный результат.
Если Вас устроит 26-разрядный результат, то можно сделать наверное
намного проще: Просто запустить один счетчик без делителя, другой
с делителем на CLK/1024. Определив предварительно смещение младшего
счетчика и предделителя для учета его (смещения) перед объединением
разрядов ICR1 и ICR3.
Вот такие мои соображения по поводу заданого Вами (мною) мне вопроса.
Желаю успехов.
Составить ответ | Вернуться на конференцию
Ответы