Доброго времени!
Уважаемые коты! Изучаю ассемблер, освоил обычный счетчик импульсов. Теперь стоит задача сделать счетчик для фиксирования показаний комбинированного счетчика воды. Данный счетчик состоит из двух счетчиков воды с разными Ду и клапана. Подскажите "котенку" как организовать подсчет, на одном мк, исключая следующие случаи:
1. одновременное срабатывание двух герконов
2. геркон одного все время во вкл. состоянии, а второй продолжает счет
Вот как я вижу: сработал первый геркон и счетчик остановился. МК начал обработку, а выйти из нее не может т.к. геркон не отключился. А в это время работает другой счетчик и мк его не обрабатывает.
Я так понимаю, что нужен одновибратор, но интересно можно ли обойтись без него, как-нить програмно
Вам нужно считать фронты или спады. Произошел фронт- прибавили счетчик. В зависимости от МК это можно сделать разными его аппаратными средствами или прграммно.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Настраиваете один из таймеров на цикличный счет, делая из него "системный таймер". Заводите переменную системного времени. По срабатыванию прерываний увеличиваете переменную, а по факту смены времени - сдвигаете регистры с вводом внешних сигналов. Дальше смотрите есть фронт или нет. Нашли фронт - считаете, не нашли - не считаете.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Meteor писал(а):Настраиваете один из таймеров на цикличный счет, делая из него "системный таймер". Заводите переменную системного времени. По срабатыванию прерываний увеличиваете переменную, а по факту смены времени - сдвигаете регистры с вводом внешних сигналов. Дальше смотрите есть фронт или нет. Нашли фронт - считаете, не нашли - не считаете.
Попытаюсь.
Выделяем регистр\регистры под системное время. Допустим два регистра R6,R7.
Выбираем будем писать сигналы в регистры общего назначения или в память. Для двух датчиков можно и в РОН. С портами могут работать РОН R16...R31. Берем R20,R21 к примеру. Еще один определяем для хранения состояния порта, пусть R19. Для ясности пусть датчики подключены к 1 и 0 разрядам порта.
Один регистр допустим R18 отводим под флаги событий.
В начале настраиваете таймер с предделителем. Допустим выбрали 8разрядный таймер Т0.
Настроили предделитель, таймер работает в нормальном режиме, т.е. считая от 0 до 255, переходит в 0 и формирует прерывание по переполнению. Разрешили прерывания.
В обработке прерывания по переполнению устанавливаем R18.0 в 1, записываем в R19 значение с порта и выходим из прерывания.
В основном цикле проверяем младший бит R18, если он равен 1, то переходим в подпрограмму увеличения системного времени. Иначе - пропускаем переход в эту подпрограмму.
В подпрограмме (ПП) счета системного времени увеличиваем R7R6 на 1, сбрасываем R18.0 в 0. Ставим R18.1 в 1. Выходим из подпрограммы.
Далее в основном цикле смотрим установлен ли R18.1 в 1 или нет.
Если R18.1=1, то заходим в подпрограмму сдвига сигналов. В ней отдельно в R20 задвигаем справа (или с лева) состояние R19.0. Аналогично в R21 задвигаем R19.1. Сбрасываем R18.1 в 0, ставим R18.2 в 1. Выходим из подпрограммы в основной цикл.
Если R18.0=0 пропускаем вызов подпрограммы.
Смотрим состояние R18.2 если 1 - вызываем ПП анализа фронта. Примем за наличие перехода состояние, когда в регистре старший нибл будет иметь одно значение (1111 или 0000), а младший - противоположное (0000 или 1111). Это идеал, в реальности не исключен дребезг, поэтому принимаем что фронт это 000хх111 или 111хх000. Сравниваем содержимое R20 и R21 с заданными значениями. Если совпадают - увеличиваем соответствующую переменную, иначе - не увеличиваем. Сбрасываем R18.2 в 0 и выходим из ПП.
В данном примере сами регистры системного времени не используются. Но, если приспичит найти длительность импульса, то достаточно записывать в память или РОН значение системного времени и при очередном событии выставив флаг в регистре R18 (их осталось еще 5 штук) перейти к ПП вычисления длительности.
Еще вдогонку.
Иногда бывает так, что общее время исполнения всех или большей части ПП превышает период формирования системного времени. Результатом может стать пропущенное событие или неправильный счет самого времени. Для корректной работы, в регистре R18 надо добавить еще один признак, на случай если нулевой бит уже установлен в 1 но не обработан. В ПП счета системного времени при одновременной установки двух флагов надо прибавлять не 1, а 2.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Зачем вводить системное время? Вроде, для счетчика оно не нужно.
M1[m^3]=N1[imp]*K1[m^3/imp]
M2[m^3]=N2[imp]*K2[m^3/imp]
Общий расход M1+M2 вывести на индикацию.