s_gary 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба Необходимо дополнить систему таким расходометром воды. Непонятно каким образом реагировать на поступающие импульсы не теряя при этом информацию. Система это насосная станция полива по расписанию, которая решает задачи контроля периода, времени полива, есть датчик освещенности и датчик осадков - все работает на прерываниях, контролер атмега 48. Ставить дополнительный маленький контроллер, который будет передавать готовые данные на основной или можно как-то решить на одном имеющемся. Инфа от продавца товара: Один литр воды выводит на выход 450 импульсов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Priest_89 8 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба А в чем, собственно, проблема? Большинство контроллеров имеют таймеры-счетчики с входом внешнего тактирования, на такой вход и подключить датчик. Если уж таймера нет, можно и по прерыванию инкрементировать программный счетчик, или просто опрашивать порт в цикле, частота то мизерная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба Почему сразу в чём проблема? Проблема в первом разе... я специально запостил в разделе для начинающих. То есть, если я найду счётчик с внешним тактированием, он будет работать аппаратно и мне останется только считывать показания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 3 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба контролер атмега 48. Один литр воды выводит на выход 450 импульсов. В атмеге есть прерывания на ножках PCINT_ по любому изменению состояния. Например для ножки №31 (PD1) это будет выглядеть так: // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: On EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); EIMSK=(0<<INT1) | (0<<INT0); PCICR=(1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0); PCMSK2=(1<<PCINT23) | (0<<PCINT22) | (0<<PCINT21) | (0<<PCINT20) | (0<<PCINT19) | (0<<PCINT18) | (1<<PCINT17) | (0<<PCINT16); PCIFR=(1<<PCIF2) | (0<<PCIF1) | (0<<PCIF0); Затем пишем функцию что делать при этом событии и вставляем туда инкремент счётчика импульсов Например: // Pin change 16-23 interrupt service routine interrupt [PC_INT2] void pin_change_isr2(void) //прерывание внешних кнопок { if (на ножке 1) cnt++; } Далее в коде делаете проверку сколько импульсов у вас "натекло", отключаете воду и сбрасывайте счётчик. Каждый расходомер можно завести на отдельную ножку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба ikm, спасибо, универсально, но... Если посадить так прямо на это прерывание расходомер, и в случае контроля 3-5 кубов, а это один два часа непрерывного счета, все остальные прерывания и вся обработка что с ними связана будет сбоить/пропадать? Как быть, или это моя паранойя... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 3 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба ikm, спасибо, универсально, но... Если посадить так прямо на это прерывание расходомер, и в случае контроля 3-5 кубов, а это один два часа непрерывного счета, все остальные прерывания и вся обработка что с ними связана будет сбоить/пропадать? Как быть, или это моя паранойя... Нет, тут как раз дело в том, что прерывание срабатывает только когда у вас есть изменение состояния ноги с"1" на "0" или обратно. По этому прерыванию выполняется тело функции. И чем это тело короче, тем меньше остальные задачи будут ждать своей очереди (кроме Reset INT0 INT1, они более приоритетные). Если совсем "на пальцах", то обработка вашего импульса от расходомера будет занимать какое то количество тактов с самом начале, а потом будет выполнятся тот код на котором программа остановилась до прерывания, пока длительность этого импульса не закончиться. Затем опять измерение состояния, начальный момент обработка прерывания, и возврат к основному циклу программы. Поэтому если импульсы у вас будут достаточно длинными (например мс), а функция минимально короткая (например одна ножка и там просто инкримент), то ресурсов на другие задачи вполне хватает. Единственное, что наверное не стоит использовать такие прерывания, если на этом же МК запущены другие таймеры и ведется учет времени, так как они будут останавливаться и в последствии набежит ошибка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 226 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба Почему сразу в чём проблема? ... если я найду счётчик с внешним тактированием Проблема в том, что если Вы, зная требования ТЗ, разбазарили все таймеры, то данную тему надо было именно так и называть. мне останется только считывать показания? Нет, останется только нарастить разрядность выбранного таймера в прерываниях. Если это будет TC2, то при 2250000 импульсах в час он будет прерывать каждые 0,4096 с. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба Plain, ничего не разбазарено, 1 восьмибитный свободен и наращивать разрядность это и так понятно, непонятно что это вы за цифры привели, можете подробнее пояснить? А какие еще могут быть решения кроме как использовать таймер с внешним тактируемым входом или прерывания int0,1? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ikm 3 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба А какие еще могут быть решения кроме как использовать таймер с внешним тактируемым входом или прерывания int0,1? Ну как писали выше. В основном цикле программы опрашивать ножки к которым подключен расходомер и фиксировать изменение логического уровня. При достаточно большой длительности импульса, вроде не должны пропустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба А какие еще могут быть решения кроме как использовать таймер с внешним тактируемым входом или прерывания int0,1? Завести UART на соответствующую скорость и по каждому импульсу получать символ. Считать символы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 226 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба непонятно что это вы за цифры привели Один литр воды выводит на выход 450 импульсов 5 кубов, а это один два часа Таким образом, привели таки не мы, а Вы, а конкретнее: 5000 л/ч · 450 имп/л = 2250000 имп/ч = 625 имп/с 256 имп / 625 имп/с = 0,4096 с Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DAndy_boy 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба Как показала практика просто сажать такие сигналы на прерывания таймера и инкрементировать переменную опасно. Простой дребезг, перебитый провод даст кучу ложных литров воды и займёт все процессорное время. Если на прерывание, то необходимо ставить аппаратный фильтр на определённую частоту, или вешать на обычный порт и фильтровать программно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба За uart надо подумать, но по-моему uart имеет определенную сетку скоростей, которая может не совпасть с частотой импульсов, которая к тому же вероятно будет "плавать", или я ошибаюсь? Plain что мне даёт время переполнения счётчика, ровным счётом ничего. Оно достаточно большое чтобы не мешать работать остальным узлам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 226 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба что мне даёт время переполнения счётчика, ровным счётом ничего. Оно достаточно большое чтобы не мешать работать остальным узлам Не понятно, Вы изрекли что-то положительное или что-то отрицательное? Нам за Вас радоваться или огорчаться? На всякий случай поясню, что всем остальным в мире такая конструкция давным давно даёт точное значение расхода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 20 июля, 2018 Опубликовано 20 июля, 2018 · Жалоба Plain а можете как радоваться так и огорчаться я не в праве запрещать. Хотя если разобраться дельного я от вас так ничего и не услышал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться