Задачка о синхронном подсчёте перепадов

Тема в разделе "WASM.ELECTRONICS", создана пользователем Black_mirror, 5 дек 2011.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Пусть имеется абстрактный микроконтроллер. Нам хочется запрограммировать счётчик на подсчёт перепадов на некоторой ноге контроллера, но так, чтобы младший разряд был установлен в 0, когда на ноге 0, и в 1, если на ноге 1. Если мы можем запрограммировать ногу как выход, то решение тривиально. Если не можем, то можно попробовать прочитать состояние ноги между двумя чтениями счётчика, и если оба раза получим одинаковые значения счётчика, значит состояние ноги не изменялось, и мы сможем понять, нужно ли инвертировать младший разряд счётчика, чтобы в дальнейшем узнать реальное состояние ноги читая только счётчик. Но если частота импульсов слишком высока чтобы программа успела два раза прочитать одно и тоже значение счётчика, можно ли в таких условиях синхронизировать счётчик без подсчёта тактов на выполнение инструкций?!
     
  2. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Если программа не успевает опрашивать - нужен более конкретный контроллер, имеющий на борту аппаратный счетчик внешних синхроимпульсов. Импульсы подать параллельно и на синхровход счетчика, и на ногу порта общего назначения. Искомый результат - сдвинутое влево на один разряд значение счетчика плюс значение ноги порта общего назначние в младшем разряде.

    Некоторая проблема все равно останется с тем, чтоб получить результат "одним махом", поскольку между чтениями ноги и аппаратного счетчика могут проскочить импульсы, но эта проблема вообще не должна быть принципиальной, если вы уже саму задачу ставите так, что программа может работать медленее, чем идут импульсы. Главное условие соблюдено - ни один импульс пропущен не будет, и если поток импульсов будет остановлен, то вы обязательно получите корректные показания.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Dmitry_Milk
    Счётчик аппаратный есть, считать перепады он успевает, нужно только понять совпадает его младший бит с состояние ноги или нужно его инвертировать.
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Black_mirror, практически все аппаратные счетчики считают перепады только в одну сторону - либо фронты, либо спады. Между ними в считающем регистре счетчика информацию о состоянии получить невозможно.

    Задача поставлена слишком абстрактно и неполно.

    То есть, если говорить более формально, то вы поставили такую задачу - необходимо знать количество полных импульсов (фронт/спад) и текущее состояние сигнала в некоторый особенный момент. А вот чем/как задается этот особенный момент, вы не уточнили. Если вы допускаете, что временное разрешение программы грубее, чем минимально возможная длительность любой фазы синхросигнала, то возможны два варианта:

    - момент задается внутри программы. Но тогда получается, что программа принципиально не может требовать особой точности, и вполне достаточно плюс/минус один импульс, а уж его фаза - подавно смысла не имеет.

    - момент задается внешним аппаратным сигналом-стробом, и точность задания особенного момента определяется точностью работы генератора данного строб-сигнала. Тогда программные выкрутасы бесполезны - надо чтоб показания счетчика и состояние подсчитываемого сигнала аппаратно сохранялись по фронту строба в отдельных регистрах-защелках, из которых уже задним числом программа (возможно по прерыванию от строба) считывала бы защелкнутое значение. Конкретные счетчики иногда бывают оборудованы подобными защелками - надо смотреть конкретную модель контроллера. Аппаратное защелкивание состояния сигнала тоже возможно иногда осуществить встроенными средствами некоторых микроконтроллеров - надо смотреть в сторону так называемых slave-портов.
     
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Вот еще извратный вариант придумался, если в контроллере есть два счетчика, оборудованных аппаратно управляемыми защелками, но нет slave-порта - можно подать подсчитываемый сигнал и строб-сигнал на соответствующие входы обоих счетчиков, но только на синхровход одного из слчетчиков подсчитываемый сигнал подать в инвертированном виде. Так получится, что один счетчик будет считать фронты, а другой счетчик - спады. По одновременно защелкнутому значению всегда можно понять, в каком же состоянии находился сигнал в момент строба.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Dmitry_Milk
    Я тоже пришёл к выводу что без дополнительных аппаратных ухищрений, если не программировать перед запуском вход как выход, то его состояние синхронизировать с младшим разрядом счётчика не получится.
    С аппаратной защёлкой хватит и одного счётчика, если защёлка может срабатывать по одному из перепадов, а счётчик подсчитывает оба. Правда обычно это разные входы, и так мы потеряем одну ногу для какой-то фигни.
    Счётчики которые считают оба перепада в контроллерах иногда встречаются, правда обычно для сигналов с частотой в два, а то и в четыре раза ниже системной.