По кругу сделано что бы видеть на приборах ... одиночный импульс не поймать ...
приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))
IMHO некрасиво сравнивать аппаратные решения с программными.
Но, с другой стороны, если с одной стороны, ТС нужно решит конкретную задачу, а с другой - он в схемотехнике чувствует себя более уверенно, чем в программировании, предложение заменить программный подход на программно-аппаратный либо аппаратный - дельная мысль.
Мне хватило бы примера единичного импульса с заданной длительностью,
я понимаю, что всё к кварцу привязывается и получить точные интервалы не получится.
Можно с частотой поиграть немного. В примере выше все идет по кругу.
Нашел код в интернетах, слегка модифицировал, тоже очень нужны были такие импульсы. Первый цикл задает длину импульса, второй расстояние между ними. Выдает что-то около 2.6 МГц или ~60 нс/шаг на минимальных значениях. Видел еще код, который дает 8 МГц прямоугольники со скважностью 50%, но там не получилось регулировать параметры импульса.
Также вопрос знатокам, в этом коде при выставлении значений length и delay более 8 происходит резкий скачок во времени и изменение шага в 6 раз (измерял на осциле, см. картинку). С чем это может быть связано? Выставлял разные типы переменных, выходил в восьмеричную и тд системы, но ничего не помогло. При этом, если накопировать в лоб строки с 1 и 0 условные 10 раз, то такого не наблюдается, идет линейный набор. Пробовал загонять в while и тп, ситуация как с for.
Спасибо, если кто-то подскажет.
p.s. Использую arduino uno.
void setup()
{
DDRD = B11111111; // set PORTD (digital 7~0) to outputs
}
void loop()
{
int length = 1;
int delay = 1;
for (int i = 1; i <= length; i++)
{
PORTD = B11111111; // set PORTD pins (digital 7~0) high
}
for (int j = 1; j <= 1; j++)
{
PORTD = B00000000; // set PORTD pins (digital 7~0) low
}
}
Возьми esp32, там есть специальный блок генерации последовательностей импульсов разной длины - RMT, с разрешением 2.5нс, если не ошибаюсь. Работает тупо от массива длин импульсов и пауз. С AVR это сплошной геморой, да еще и разрешение так себе.
...около 2.6 МГц или ~60 нс/шаг на минимальных значениях...
Вы с порядком ошиблись ...
herzdp пишет:
...более 8 происходит резкий скачок во времени и изменение шага в 6 раз (измерял на осциле, см. картинку). С чем это может быть связано? ...
скачок легко объяснить ...
если включена оптимизация, то компилятор несколько циклов заменяет повтором
когда простой повтор содержимого цикла порождает код, больший чем код с использованием циклов, то компилятор начинает использовать циклы вместо повтора и одна однотактовая команда заменяется на:
приращение счетчика,
сравнение (задействован тип int, а это 16 бит на 8 битном процессоре - опять лишние команды),
переход ...
это и приводит к скачку...
чем вы компилируете и какой уровень оптимизации выставлен для компилятора ? нужен листинг программ без скачка и со скачком...
и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?
и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?
Вы знаете, в подавляющем большинстве случаев микроконтроллер поступает точено так же, как делал бы человек, окажись он на его месте.
Представьте, что именно Вы принимаете последовательность импульсов (естественно, в нормальном для Вас темпе). Как бы Вы поступили на месте микроконтроллера? Распишите подробно Ваши действия - это и будет алгоритм решения задачи. Останется только перевести этот алгоритм с русского на Си.
У таймера STM есть один из режимов захвата импульсов. Я на нём написал чтение DHT22. Там тоже импульсы надо цифровать и паузы. Таймер делает всё сам. Его инициализировал и в прерывании по окончании серии считываешь два массива - импульсы и паузы. И не надо ждать пока DHT разродиться на данные.
и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?
Вы знаете, в подавляющем большинстве случаев микроконтроллер поступает точено так же, как делал бы человек, окажись он на его месте.
Представьте, что именно Вы принимаете последовательность импульсов (естественно, в нормальном для Вас темпе). Как бы Вы поступили на месте микроконтроллера? Распишите подробно Ваши действия - это и будет алгоритм решения задачи. Останется только перевести этот алгоритм с русского на Си.
У таймера STM есть один из режимов захвата импульсов. Я на нём написал чтение DHT22. Там тоже импульсы надо цифровать и паузы. Таймер делает всё сам. Его инициализировал и в прерывании по окончании серии считываешь два массива - импульсы и паузы. И не надо ждать пока DHT разродиться на данные.
Ну так не надо отвёрткой гвозди заворачивать, а молотком шурупы забивать. Под каждую задачу нужен свой инструмент. А пытаться решить задачи тем что есть под рукой, это как стоя в гамаке - спасибо микаде за напоминание анекдота.
Ну так не надо отвёрткой гвозди заворачивать, а молотком шурупы забивать. Под каждую задачу нужен свой инструмент. А пытаться решить задачи тем что есть под рукой, это как стоя в гамаке - спасибо микаде за напоминание анекдота.
Верно. А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)
Да я вообще не программист, но нужда появилась, делаю как могу.
Да, есть фриланс, знаю...
Да я вообще не программист, но нужда появилась, делаю как могу.
Ну и научиться уже хочу..
По кругу сделано что бы видеть на приборах ... одиночный импульс не поймать ...
приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))
По кругу сделано что бы видеть на приборах ... одиночный импульс не поймать ...
приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))
Но, с другой стороны, если с одной стороны, ТС нужно решит конкретную задачу, а с другой - он в схемотехнике чувствует себя более уверенно, чем в программировании, предложение заменить программный подход на программно-аппаратный либо аппаратный - дельная мысль.
приходилось ловить триггером защёлкой и нулевые и единичные, иначе термопласт не давался )))
Я про отладку код-результат (в доступной форме).
Мне хватило бы примера единичного импульса с заданной длительностью,
я понимаю, что всё к кварцу привязывается и получить точные интервалы не получится.
Можно с частотой поиграть немного. В примере выше все идет по кругу.
Нашел код в интернетах, слегка модифицировал, тоже очень нужны были такие импульсы. Первый цикл задает длину импульса, второй расстояние между ними. Выдает что-то около 2.6 МГц или ~60 нс/шаг на минимальных значениях. Видел еще код, который дает 8 МГц прямоугольники со скважностью 50%, но там не получилось регулировать параметры импульса.
Также вопрос знатокам, в этом коде при выставлении значений length и delay более 8 происходит резкий скачок во времени и изменение шага в 6 раз (измерял на осциле, см. картинку). С чем это может быть связано? Выставлял разные типы переменных, выходил в восьмеричную и тд системы, но ничего не помогло. При этом, если накопировать в лоб строки с 1 и 0 условные 10 раз, то такого не наблюдается, идет линейный набор. Пробовал загонять в while и тп, ситуация как с for.
Спасибо, если кто-то подскажет.
p.s. Использую arduino uno.
void setup()
Возьми esp32, там есть специальный блок генерации последовательностей импульсов разной длины - RMT, с разрешением 2.5нс, если не ошибаюсь. Работает тупо от массива длин импульсов и пауз. С AVR это сплошной геморой, да еще и разрешение так себе.
...около 2.6 МГц или ~60 нс/шаг на минимальных значениях...
Вы с порядком ошиблись ...
...более 8 происходит резкий скачок во времени и изменение шага в 6 раз (измерял на осциле, см. картинку). С чем это может быть связано? ...
скачок легко объяснить ...
если включена оптимизация, то компилятор несколько циклов заменяет повтором
когда простой повтор содержимого цикла порождает код, больший чем код с использованием циклов, то компилятор начинает использовать циклы вместо повтора и одна однотактовая команда заменяется на:
приращение счетчика,
сравнение (задействован тип int, а это 16 бит на 8 битном процессоре - опять лишние команды),
переход ...
это и приводит к скачку...
чем вы компилируете и какой уровень оптимизации выставлен для компилятора ? нужен листинг программ без скачка и со скачком...
Другая задача теперь.
Допустим, есть два массива в коде
и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?
Думаю, что нужно начинать с первого импульса и считать время по нарастающей, прибавляя с каждым фронтом и спадом.
Так будет точнее.
Другая задача теперь.
Допустим, есть два массива в коде
и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?
Вы знаете, в подавляющем большинстве случаев микроконтроллер поступает точено так же, как делал бы человек, окажись он на его месте.
Представьте, что именно Вы принимаете последовательность импульсов (естественно, в нормальном для Вас темпе). Как бы Вы поступили на месте микроконтроллера? Распишите подробно Ваши действия - это и будет алгоритм решения задачи. Останется только перевести этот алгоритм с русского на Си.
У таймера STM есть один из режимов захвата импульсов. Я на нём написал чтение DHT22. Там тоже импульсы надо цифровать и паузы. Таймер делает всё сам. Его инициализировал и в прерывании по окончании серии считываешь два массива - импульсы и паузы. И не надо ждать пока DHT разродиться на данные.
Настройка таймера в кубе:
Другая задача теперь.
Допустим, есть два массива в коде
и есть последовательность импульсов на цифровом входе.
Как сравнить эту последовательность с массивами?
По-другому говоря, это стартовые биты и их нужно распознать.
Может есть доступный способ это сделать или хотя бы как правильно это обозвать в поиске?
Вы знаете, в подавляющем большинстве случаев микроконтроллер поступает точено так же, как делал бы человек, окажись он на его месте.
Представьте, что именно Вы принимаете последовательность импульсов (естественно, в нормальном для Вас темпе). Как бы Вы поступили на месте микроконтроллера? Распишите подробно Ваши действия - это и будет алгоритм решения задачи. Останется только перевести этот алгоритм с русского на Си.
Да, всё верно, с недавних пор так и стал делать.
У таймера STM есть один из режимов захвата импульсов. Я на нём написал чтение DHT22. Там тоже импульсы надо цифровать и паузы. Таймер делает всё сам. Его инициализировал и в прерывании по окончании серии считываешь два массива - импульсы и паузы. И не надо ждать пока DHT разродиться на данные.
Настройка таймера в кубе:
Не раз уже к STM отправляли
Ну так не надо отвёрткой гвозди заворачивать, а молотком шурупы забивать. Под каждую задачу нужен свой инструмент. А пытаться решить задачи тем что есть под рукой, это как стоя в гамаке - спасибо микаде за напоминание анекдота.
Верно. А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)
А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)
Не факт.
А потом - ты еще закрути его - гвоздь отверткой.
А вообще, шуруп, забитый молотком, держит лучше, чем гвоздь, закрученный отвёрткой)
Не факт.
А потом - ты еще закрути его - гвоздь отверткой.
Это шутка такая))