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

Обсуждаем цифровые устройства...
Ответить
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пн янв 25, 2010 17:22:45

Сообщение <ALEX> »

Доброго времени!
Уважаемые коты! Изучаю ассемблер, освоил обычный счетчик импульсов. Теперь стоит задача сделать счетчик для фиксирования показаний комбинированного счетчика воды. Данный счетчик состоит из двух счетчиков воды с разными Ду и клапана. Подскажите "котенку" как организовать подсчет, на одном мк, исключая следующие случаи:
1. одновременное срабатывание двух герконов
2. геркон одного все время во вкл. состоянии, а второй продолжает счет
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

В МК организуете два счетчика, которые считают импульсы от каждого геркона.
<ALEX> писал(а):2. геркон одного все время во вкл. состоянии, а второй продолжает счет
Ну значит с одного нет импульсов, в чем тут вопрос?
Какой МК то хоть?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пн янв 25, 2010 17:22:45

Сообщение <ALEX> »

Вот как я вижу: сработал первый геркон и счетчик остановился. МК начал обработку, а выйти из нее не может т.к. геркон не отключился. А в это время работает другой счетчик и мк его не обрабатывает.
Я так понимаю, что нужен одновибратор, но интересно можно ли обойтись без него, как-нить програмно
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вам нужно считать фронты или спады. Произошел фронт- прибавили счетчик. В зависимости от МК это можно сделать разными его аппаратными средствами или прграммно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пн янв 25, 2010 17:22:45

Сообщение <ALEX> »

для "экскрементов" использую атмега8
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Настраиваете один из таймеров на цикличный счет, делая из него "системный таймер". Заводите переменную системного времени. По срабатыванию прерываний увеличиваете переменную, а по факту смены времени - сдвигаете регистры с вводом внешних сигналов. Дальше смотрите есть фронт или нет. Нашли фронт - считаете, не нашли - не считаете.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пн янв 25, 2010 17:22:45

Сообщение <ALEX> »

А можно это на пальцах объяснить
Meteor писал(а):Настраиваете один из таймеров на цикличный счет, делая из него "системный таймер". Заводите переменную системного времени. По срабатыванию прерываний увеличиваете переменную, а по факту смены времени - сдвигаете регистры с вводом внешних сигналов. Дальше смотрите есть фронт или нет. Нашли фронт - считаете, не нашли - не считаете.
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение 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... не спрашивайте даже
Контактная информация:
akl
Друг Кота
Сообщения: 4459
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Зачем вводить системное время? Вроде, для счетчика оно не нужно.
M1[m^3]=N1[imp]*K1[m^3/imp]
M2[m^3]=N2[imp]*K2[m^3/imp]
Общий расход M1+M2 вывести на индикацию.
Друг Кота
Аватара пользователя
Сообщения: 15657
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Два геркона с ...
вращающимся диском с магнитиками?
собственно суть датчиков на примитивной схеме нарисовать надо.
8)
Ответить

Вернуться в «Цифровая техника»