но в данном случае мне интересны подходы к решению. Даже, пожалуй, больше, чем само решение. Я пытаюсь разобраться- "как оно работает".
С какой целью вы интересуетесь алгоритмом программы? Если вас всё устраивает в данном алгоритме. Я думал вам нужен именно девайс, который сделал и забыл...
Скорее просто вариант посмотреть как пишутся программы. Или недостаток учебников по соответствующей теме. Алгоритмы простые и общеизвестные и подгоняются под соответствующий вид/тип МК и применяемый компилятор (среду разработки). Там заметно проще свою программу написать. Чего там секретить то? Частотомер, периодомер, измеритель длительности интервала - выбираем и смотрим, что подходит.
но в данном случае мне интересны подходы к решению. Даже, пожалуй, больше, чем само решение. Я пытаюсь разобраться- "как оно работает".
С какой целью вы интересуетесь алгоритмом программы? Если вас всё устраивает в данном алгоритме. Я думал вам нужен именно девайс, который сделал и забыл...
Интересуюсь потому, что например, генератор- в Вашем варианте, он- не отключаем. Наверняка, кому-то такой вариант подойдет, но я бы у себя отключил. Дергать занятого человека: включи мне то, отключи мне это- как-то не совсем удобно. И так чувствую себя неловко... А алгоритм и код- можно было бы понять и как работает, и подогнать под себя. Лучше объяснить не умею...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Не пойму чем мешает встроенный в алгоритм генератор. Если он не нужен, то можно его и не использовать. Он ведь на основную задачу (определения входной частоты) не влияет.
Но раз хочется написать свой вариант, то данная задача проста как гвоздь. То есть, за одну секунду необходимо посчитать количество импульсов. Если количество импульсов меньше установленного значения, то светодиод отключаем, а если равно или больше установленного значения, светодиод включаем. И такой подсчёт производим каждую секунду – всё. Задействовать для отсчёта нужного интервала времени, можно как встроенный счётчик, так и сторожевой таймер (это кому как предпочтительней). А подсчёт входных импульсов можно производить по внешнему прерыванию. Вот собственно и всё.
Генератор временных интервалов основной элемент что в частотомере, что в периодомере. В первом случае генерируется измерительное окно заданной длительности и считается количество попавших в то окно импульсов. Во втором генерируются импульсы заданной длительности и подсчитывается их количество в искомом периоде, который определяется длительностью периода входного импульса. Какой вариант удобнее использовать определяем по соотношению периодов искомых импульсов и измерительного окна. Ну и сам МК без генератора не работоспособен - это одна из его основных составляющих.
Не пойму чем мешает встроенный в алгоритм генератор. Если он не нужен, то можно его и не использовать. Он ведь на основную задачу (определения входной частоты) не влияет.
Но раз хочется написать свой вариант, то данная задача проста как гвоздь. То есть, за одну секунду необходимо посчитать количество импульсов. Если количество импульсов меньше установленного значения, то светодиод отключаем, а если равно или больше установленного значения, светодиод включаем. И такой подсчёт производим каждую секунду – всё. Задействовать для отсчёта нужного интервала времени, можно как встроенный счётчик, так и сторожевой таймер (это кому как предпочтительней). А подсчёт входных импульсов можно производить по внешнему прерыванию. Вот собственно и всё.
Послушайте, товарищ VNS... Алгоритм подсчета и так понятен- не нужно так разжевывать, будто для тупых... На логике я же как-то справился, а там принцип тот же- но не устроила громоздкость и... вот новость- архаичность. Захотелось современности и новизны. Я Вас не принуждал клепать проекты, рисовать рисунки, но, если уж Вы напряглись и ворвались в тему- вот я самый умный и быстрый, вот как я умею, то выложите, уж- ВСЁ, а не только никому не интересный хекс. Компилировать умеют, уже наверное, и в 5 классе... Уверен, и другим читателям было бы интересен ваш ход мысли и изящность написания программы- на чем бы вы там не писали. Можно было бы поспорить, или бесспорно согласится- это жизня. А вы- такое чувство, будто с врагами общаетесь, а не с единомышлениками... Конечно я дойду до написания того, что мне нужно. Потрачу времени больше, но сделаю- как хочется. Вам- всего наилучшего.
Ну и сам МК без генератора не работоспособен - это одна из его основных составляющих.
Там, в проекте, специально на отдельную ногу выведен "генератор импульсов"- якобы, для проверки "порога срабатывания". В принципе не понятно кому он может понадобится, и, главное зачем- когда программно заложенно- зажигать светодиод после 27 импульсов. Или, что: программа может сбиться и начать считать не 27 а 37 импульсов? И он (этот генератор)- не отключается. Он, либо генерит чаще, либо- реже. Грубо говоря, "маслает" бесполезный генератор, жрет ресурсы МК и он там, в натуре нафиг не нужен, но- такова точка зрения автора. Выложить исходник он не желает, посему там нечего и обсуждать- фтопку. Почитаю разных учебников- сам напишу...
Dmitrudo вы немного не правы.... VNS решил вашу просьбу и всё, более ничего он вам не обязан...хотите написать своё, так тогда не стоило и тему заводить...
Dmitrudo вы немного не правы.... VNS решил вашу просьбу и всё, более ничего он вам не обязан...хотите написать своё, так тогда не стоило и тему заводить...
Если Вы отмотаете в начало, то легко убедитесь, что у меня никаких просьб не было, кроме одной: получить совет- на какой элементной базе собрать свою поделку. Но, уж если так вышло, что товарищ сам по собственной воле решил показать свои способности, то, лично мне, был бы интересен исходник с каментами- что там, к чему и для чего. Но встретил непонимание и даже упреки, мол: чем вам ТО ЧТО ЕСТЬ не нравиться? Пытался объясниться, но снова не был понят. В итоге, да- "писал свое".
Продолжая, и заканчивая тему... Не удовлетворившись ограниченным предложением пришлось код писать самому. С помошью ИИ, было опробовано 27 вариантов кода, из которых удовлетворил последний- будучи переделанным из моргалки светодиодом- в счетчик импульсов. https://arduinodiy.wordpress.com/2015/0 ... -attiny13/
ИИ помощник- тот еще "помощник". Почти всегда пускал по ложному пути и всегда за ним приходилось "подчищать". Всегда норовил подсунуть "не то". В общем, это был ценный опыт. Но, научился хотя бы ориентироваться в Си. ИИ охотно объяснял непонятные моменты и давал много попутной информации, получить которую где-либо в другом месте я бы не смог. Для написания текста решил использовать Микрочип Студию- продвинутая штука, конечно. В тоже время, Ардуино ИДЕ показался громоздким.
Что хотелось бы отметить.., реализовать свою "хотелку" и использовать WDT в качестве источника прерываний 1 Гц- так и не удалось. В сети не очень много инфы на эту тему, а та что есть- у меня не сработала. Но, учитывая мой "богатый опыт" это и не удивительно, но зацепило. Буду пробовать еще.
В итоге использовал классику- прерывания на порту INT0 и таймер- для генерации секундных интервалов. Все оказалось просто. По ходу дела скорректировал свои требования. Итак... Схема выдает лог1 на Вых при 27 импульсах в секунду на Входе. Лог0 на Вых появляется при снижении частоты на Входе ниже 10 Гц. Все работает.
Спойлер#include <avr/io.h> // Библиотека для работы с регистрами ввода-вывода AVR #include <avr/interrupt.h> // Библиотека для работы с прерываниями volatile uint8_t timer_count = 0;// Cчетчик времени volatile uint8_t pulse_count = 0;// Cчетчик импульсов
// Обработчик прерывания по изменению состояния на порту PB1 ISR(INT0_vect) { pulse_count++; // Увеличиваем счетчик при каждом прерывании }
// Обработчик прерывания таймера TIMER0 ISR(TIM0_OVF_vect) { if (++timer_count > 4) { // Прерывание примерно 4,6 раз за 1 сек if (pulse_count > 29) { // Число импульсов необходимо подбирать PORTB |= (1 << PB3) | (1 << PB4); // Устанавливаем лог 1 на PB3 и PB4 } else if (pulse_count < 10) { PORTB &= ~((1 << PB3) | (1 << PB4)); // Устанавливаем лог 0 на PB3 и PB4 } timer_count = 0; // Сбросить счетчик pulse_count = 0; // Сбрасываем счетчик импульсов } }
void setup() {
cli(); // Отключить прерывания
DDRB = (1<<PB3) | (1<<PB4); // Настроить PB3 и PB4 как выход
Сейчас этот форум просматривают: aleksey_1184 и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения