Страница 1 из 1

Подсчет импульсов на комбинированном счетчике воды

Добавлено: Вт янв 31, 2017 07:46:21
<ALEX>
Доброго времени!
Уважаемые коты! Изучаю ассемблер, освоил обычный счетчик импульсов. Теперь стоит задача сделать счетчик для фиксирования показаний комбинированного счетчика воды. Данный счетчик состоит из двух счетчиков воды с разными Ду и клапана. Подскажите "котенку" как организовать подсчет, на одном мк, исключая следующие случаи:
1. одновременное срабатывание двух герконов
2. геркон одного все время во вкл. состоянии, а второй продолжает счет

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Вт янв 31, 2017 19:00:08
Z_h_e
В МК организуете два счетчика, которые считают импульсы от каждого геркона.
<ALEX> писал(а):2. геркон одного все время во вкл. состоянии, а второй продолжает счет
Ну значит с одного нет импульсов, в чем тут вопрос?
Какой МК то хоть?

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Вт янв 31, 2017 20:55:47
<ALEX>
Вот как я вижу: сработал первый геркон и счетчик остановился. МК начал обработку, а выйти из нее не может т.к. геркон не отключился. А в это время работает другой счетчик и мк его не обрабатывает.
Я так понимаю, что нужен одновибратор, но интересно можно ли обойтись без него, как-нить програмно

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Вт янв 31, 2017 21:31:14
Z_h_e
Вам нужно считать фронты или спады. Произошел фронт- прибавили счетчик. В зависимости от МК это можно сделать разными его аппаратными средствами или прграммно.

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Вт янв 31, 2017 21:48:35
<ALEX>
для "экскрементов" использую атмега8

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Вт янв 31, 2017 23:00:07
Meteor
Настраиваете один из таймеров на цикличный счет, делая из него "системный таймер". Заводите переменную системного времени. По срабатыванию прерываний увеличиваете переменную, а по факту смены времени - сдвигаете регистры с вводом внешних сигналов. Дальше смотрите есть фронт или нет. Нашли фронт - считаете, не нашли - не считаете.

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Ср фев 01, 2017 07:53:45
<ALEX>
А можно это на пальцах объяснить
Meteor писал(а):Настраиваете один из таймеров на цикличный счет, делая из него "системный таймер". Заводите переменную системного времени. По срабатыванию прерываний увеличиваете переменную, а по факту смены времени - сдвигаете регистры с вводом внешних сигналов. Дальше смотрите есть фронт или нет. Нашли фронт - считаете, не нашли - не считаете.

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Ср фев 01, 2017 21:13:25
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.

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Чт фев 02, 2017 07:29:48
akl
Зачем вводить системное время? Вроде, для счетчика оно не нужно.
M1[m^3]=N1[imp]*K1[m^3/imp]
M2[m^3]=N2[imp]*K2[m^3/imp]
Общий расход M1+M2 вывести на индикацию.

Re: Подсчет импульсов на комбинированном счетчике воды

Добавлено: Чт фев 02, 2017 10:08:56
BOB51
Два геркона с ...
вращающимся диском с магнитиками?
собственно суть датчиков на примитивной схеме нарисовать надо.
8)