ruhi

логическое И на AVR

48 сообщений в этой теме

ruhi    35

Меня тут порадовали задачкой для АВР (я когда то очень много таких порешал, на практике - напомнили молодость :) ):

http://cxem.net/mc/mc446.php

сформулирована так: Нужно два быстрых элемента "И" и одновибратор. Можно использовать серию 155 у которой время срабатывания даже меньше получается, но не подходит по энергопотреблению. Хотелось бы сделать это на Attiny13.

Остановимся пока на 

Цитата

два быстрых элемента "И"

Я, соответственно, предложил реализацию:

Можожно сделать так:
loop1:
in reg1, pina; 1-tick
in reg2, pinb; 1-tick
and reg1, reg2; 1-tick
LSR reg1; 1-tick
out portB, reg1; 1-tick
rjmp loop1; 2-tick

Это код на ассемблере , который реализует два «элемента И» на АВР со временем срабатывания около 1мкс, в зависимости от тактовой частоты МК.

На частоте 16 MHz это 7/16 мк-секунды(7 ticks, на самом деле +4 = 11тиков максимум время срабатывания, позже поясню), входы элемента-И должны быть на одинаковых пинах условных портов A and B, а выходы следующие по старшинству биты-пины. Вообще говоря перед выводом в порт, скорее всего, нужно будет еще маску добавить это еще +1 тик!


Цикл можно переделать на использование только одного порта. Мой вариант в закодированном архиве приатачен, ключ выложу через неделю!

Мне интересно можно ли сделать быстрее чем у меня получилось! Сможет кто нибудь предложить вариант решения?
В общем, похоже что, на ассемблере можно написать «два элемента И» со временем срабатывания около 1.5мкс даже на 10МГц при произвольном расположении ног на одном порту.

bestAvrCodeForAnd.7z

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256

К сожалению,  проблема не в скорости. Проблема в ДЖИТТЕРЕ.

На выходе Вы получите мечущийся фронт с переменной задержкой.

Использовать тактируемый автомат в качестве жесткой логики - беспонтовая тема.

Поэтому сейчас в МК применяются специальные микро ПЛИС (как периферийный модуль) для решения входных и выходных логических асинхронных задач.

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
5 минут назад, my504 сказал:

К сожалению,  проблема не в скорости. Проблема в ДЖИТТЕРЕ.

На выходе Вы получите мечущийся фронт с переменной задержкой от почти нуля до 1,5 мкс.

Использовать тактируемый автомат в качестве жесткой логики - беспонтовая тема.

Життер это для периодических сигналов, можно уточнить задачу:

переключения случаются не чаще раз в мили секунду, случайность задержки срабатывания в пределах до максимально разрешенной задержки разрешена!

То есть по условию задачи, життер в вашем определении, не является проблемой!

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256

Джиттер - это для ЛЮБОГО сигнала. Нестабильность фронта выходного сигнала по отношению к входному и есть джиттер.

Если речь о миллисекундах, то зачем чего то там оптимизировать? Как правило, подобную логику делают с входной и выходной синхронизацией. То есть с определенным тактированием защелкивают входы, программно рассчитывают выходную функцию, а потом ее разом выводят (выходное тактирование). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
15 минут назад, my504 сказал:

Как правило, подобную логику делают с входной и выходной синхронизацией. То есть с определенным тактированием защелкивают входы, программно рассчитывают выходную функцию, а потом ее разом выводят (выходное тактирование). 

Было бы интересно посмотреть код! Скажу по секрету у меня получилось 6 (шесть) инструкций в цикле.

А оптимизировать надо чтобы понять пределы возможного.То есть, на что же можно рассчитывать!

15 минут назад, my504 сказал:

Джиттер - это для ЛЮБОГО сигнала. Нестабильность фронта выходного сигнала по отношению к входному и есть джиттер.

Я про другое определение думал, но в данном контексте такое определение совершенно уместно, но такой життер не является проблемой по условиям задачи, он разрешен, главное что он ограничен сверху!

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@ruhi Распишите точно задачу. А то в комментах по ссылке куча всего. И диаграммки желательно тоже. Ну вы и хвастун)))

Изменено пользователем MasterElectric

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В ответе вариант с мультивибратором или просто логическое И 2 шт.? Ничего не понятно. А что желающих нет :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
В 29.01.2018 в 22:01, MasterElectric сказал:

Распишите точно задачу.

Про одновибратор я сам еще до конца не выяснил! Поэтому:

Нужно чтобы три ноги контроллера работали как элемент логическое-И, с минимально возможным максимальным временем срабатывания, то есть, например:

если на вход1 подана логическая единица,

на входе2 логический ноль, на выходе должен быть лог-ноль.

И при переключении входа2 в 1-цу , на выходе с задержкой Т (не больше Т!!! - то есть меньше можно!!!) должна появиться логическая единица!

Соответственно, надо написать код который реализует ДВА таких элемента на одном порте контроллера, то есть на ногах одного порта (PORTB, PINB, DDRB - например). И определить соответствующее этому коду максимальное Т!

Это, получается, задача определения предельных возможностей управления портом на AVR-ассемблере (спасибо @my504 за уточняющие вопросы), для всей линейки процессоров поддерживающих систему команд. На результат решения которой, в дальнейшем можно ориентироваться при разработке прикладных решений(, как минимум, а, даст бог, и еще что то интересное проявится).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
В 26.01.2018 в 17:49, my504 сказал:

Если речь о миллисекундах, то зачем чего то там оптимизировать?

Там время срабатывания должно быть хотя бы в десять раз (и тоже "например"!) меньше чем время переключения на входах, миллисекунды я для примера назвал, может быть и меньше, собственно максимальное время переключения, как раз и определяет с какой скоростью можно переключать входные сигналы, то есть с какой скоростью можно реагировать!

Кстати, если вы посмотрите программную реализацию USB на AVR, то как раз увидите где это надо! Там как раз подобная задача, только намного заковыристее, прямого контроля-управления "ногами" решена,

там следят за фронтами, меряют время, выставляют уровни в соответствии с заданными последовательностями фронтов, задержек ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    376

При наличии достаточного объема flash проблема джиттера и быстродействия решается достаточно просто: для всех комбинаций пинов порта составляется таблица выходных состояний "логических элементов", затем считывается порт, по таблице находится выходное состояние и выводится в порт. Джиттер отсутствует, быстродействие предельное. Легко реализуются любые "логические" элементы с общим количеством входов до 8 и таким же кол-вом выходов.

Можно таблицу и в ОЗУ сделать, если его больше 256 байтов, и это, возможно, позволит еще чуток поднять быстродействие...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256
1 минуту назад, ARV сказал:

 Джиттер отсутствует

Даладна!!!

:lol:

Джиттер НЕИЗБЕЖЕН при ЛЮБОМ синхронном приеме сигнала. Входной сигнал и сигнал тактирования входной защелки некогерентны по определению, а значит будут наблюдаться БИЕНИЯ внутреннего входного, а значит и выходного, сигнала.

Ровно поэтому невозможно осуществить захват асинхронного счетчика внутренним тактированием МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
6 минут назад, ARV сказал:

При наличии достаточного объема flash проблема джиттера и быстродействия решается достаточно просто: для всех комбинаций пинов порта составляется таблица выходных состояний "логических элементов", затем считывается порт, по таблице находится выходное состояние и выводится в порт. Джиттер отсутствует, быстродействие предельное. Легко реализуются любые "логические" элементы с общим количеством входов до 8 и таким же кол-вом выходов.

Можно таблицу и в ОЗУ сделать, если его больше 256 байтов, и это, возможно, позволит еще чуток поднять быстродействие...

Джиттер (очень мне не нравится использование этого термина в данном контексте, ну ладно), не возможно исключить, а в остальном, именно при этом подходе получилось 6(шесть) инструкций в цикле!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    376

В моём понимании джиттер - это недетрминированные колебания интервала между сменой сигнала на входе и соответствующего изменения на выходе. Иначе говоря, колебания длительности "времени распространения" сигнала. С точностью до периода тактовой частоты МК в табличном методе джиттер будет отсутствовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256
7 минут назад, ruhi сказал:

если вы посмотрите программную реализацию USB на AVR, то как раз увидите где это надо!

Это "надо" при любых софтовых задачах. Но причем тут USB? Этот протокол совершенно нечувствителен к джиттеру.  Мало того, его софтовая реализация не позволяет реализовать поставленную здесь задачу, поскольку управление стеком (машиной состояний стека) имеет более высокий приоритет, нежели логическая функция выхода или входа. Оная функция - суть есть крошечный кусок кода общего цикла.

3 минуты назад, ARV сказал:

С точностью до периода тактовой частоты МК

А период тактовой частоты - это не джиттер? :o

Тут обсуждается вопрос в скорости реакции измеряемой  максимум десятком циклов. Зачем нужна такая скорость, если 8...10%-ный джиттер - это "не джиттер"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
4 минуты назад, my504 сказал:

Но причем тут USB? Этот протокол совершенно нечувствителен

USB не при чем, я упомянул ПрОГРАММНУЮ РЕАЛИЗАЦИЮ юсб. 

проблема неопределенности времени реакции на фронт там тоже присутствует, и она решена!

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256

Программная реализация ЮСБ ничем не отличается от железной.  Организовать формальный опрос-логическую функцию-вывод при управлении D+D- невозможно без учета требуемого времени на остальное. Время потраченное на примитивную логическую функцию и ввод-вывод  на несколько десятичных порядков меньше остального.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@ruhi Ну у меня получилось 8 и 9 инструкций, быстрее не придумал. Интересно будет посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
2 минуты назад, my504 сказал:

Программная реализация ЮСБ ничем не отличается от железной.

Это как это? Это похоже на то что вы заговариваетесь, пытаясь доказать то что вам хочется, даже не смотря на то что это не соответствует действительности :( !

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256

Приведите пример. В каком месте USB протокола нужно с высокой скоростью выводить бит на основании анализа двух других битов?

Может я чего то и не знаю, но в протоколе USB нет такой процедуры...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@ARV В случае с AVR таблица таки не самый быстрый вариант, по тактам точно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
7 минут назад, my504 сказал:

высокой скоростью выводить бит на основании анализа двух других битов?

там анализируются фронты и задержки на одной линии (один бит), но алгоритм работает на основе как минимум двух значений: текущего значения бита, задержки от предыдущего фронта.

и я уже точно не помню, но кажется в каких то случаях анализируются, все таки обе линии D+ D-.

Изменено пользователем ruhi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мой вариант:

// вариант №1
start:
    in        r16, PinB
    mov       r17, r16
    lsl       r17
    and       r16, r17
    lsl       r16 
    andi      r16, 0x24
    out       PortB, r16
    rjmp      start

// вариант №2
start_2:
    ldi       r16, 0x24       
    sbic      PinB, 0
    sbis      PinB, 1
    cbr       r16, 0x04
    sbic      PinB, 3
    sbis      PinB, 4
    cbr       r16, 0x20
    out       PortB, r16
    rjmp      start_2

 

@ARV Да я ошибался, думал вычисление смещения займет много времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    256
51 минуту назад, ruhi сказал:

там анализируются фронты и задержки на одной линии (один бит), но алгоритм работает на основе как минимум двух значений: текущего значения бита, задержки от предыдущего фронта.

и я уже точно не помню, но кажется в каких то случаях анализируются, все таки обе линии D+ D-.

 

Анализ состояния двух пинов (они дифференциальные) собственно необязателен, но желателен, чтобы обеспечить помехозащищенность.

Даже если и находить логическую функцию этих пинов, причем тут ВЫВОД? 

Вы так и не показали аналог проставленной здесь задачи по реализации вентиля И (ИЛИ, исключающее ИЛИ и т.п.).

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
1 час назад, my504 сказал:

Вы так и не показали аналог проставленной здесь задачи по реализации вентиля И (ИЛИ, исключающее ИЛИ и т.п.).

Под тем что задача аналогичная, я имел ввиду, что там тоже написан на ассемблере и прерываниях анализ "ног" контроллера, и в зависимости от этого анализа формируются уровни на портах строго по тактам.

Извините за недосказанность!

Совершенно точно можно сказать, что там реализована некоторая логическая функция (намного более сложная!!!), я не в коем случае, не утверждал что там реализован именно вентиль И (ИЛИ, исключающее ИЛИ ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: DimonRX
      Всем доброго времени суток!
      В AVR-ках я новичёк и очень нуждаюсь в вашей помощи.
      Задача у меня следующая. Есть драйвер управления серводвигателем на ATmega88. Помимо основной задачи ATmega88 через 74HC164D выводит на сдвоенный 7-ми сегментный индикатор направление вращения мотора в виде анимации (вращает сегмент по или против часовой стрелки). Рядом есть некая поделка на ATmega8, одной из задач которой является определение направления вращения мотора и, в зависимости от направления, выполнение различных действий. Как мне это сделать? Как подружить две меги? Всем заранее спасибо.
    • Автор: Kirill Lubinets
      Дано: отладочная плата STM32F303VC, индукционный датчик.

      Доброго времени суток, суть моего проекта в  детектировании вибраций(ударов) при помощи аналогового датчика.
      Код отслеживания удара написан, но я не пойму то ли я ошибся с алгоритмом его работы то ли не правильно сконфигурировал отладочную плату.

      Информация по датчику.
      Индукционный датчик удара, шок сенсор, Arduino может использоваться в проектах на микроконтроллерах (в т.ч. Arduino), в которых нужно следить за уровнем вибрации или подобных механических возмущений. Принцип действия датчика основан на электромагнитной индукции. Движущийся стальной, ферритовый или магнитный сердечник относительно катушки создает в катушке ЭДС, подходящую по амплитуде ударного воздействия на систему. Чувствительный элемент датчика установлен в прозрачный пластиковый параллелепипед для защиты от действий внешней среды.
      Для использования датчика нужно подключить его к Arduino контроллеру или другому микропроцессорному управляющему устройству, подать питание, создать программу для работы с датчиком или использовать готовое решение. На корпусе датчика есть два отверстия, с помощью которых можно жестко закрепить датчик на плоской поверхности. В состоянии покоя напряжение на выходе из датчика около 5 В, при возмущении напряжение на датчике падает пропорционально силе возмущения.
      Индукционный датчик удара, шок сенсор, Arduino имеет один 3-контактный разъем для подключения к контроллеру и питания:
      контакт обозначенный «–» – общий контакт;
      средний контакт – напряжение питания;
      контакт S – аналоговый выходной сигнал датчика.
      Датчик может питаться как от Arduino контроллера (другого микропроцессорного управляющего устройства), так и от внешнего источника питания. Напряжение питания 3,3 – 5 вольт постоянного тока.
      Характеристики:
      принцип действия: индукционный;
      выходной сигнал: аналоговый;
      напряжение питания: 3,3 – 5 вольт постоянного тока;
      размеры: 30 х 18 х 11;
      вес: 2 г.
      Shock.7z
    • Автор: Петр Серёгин
      Здравствуйте, у меня проблема.
      Не программируется ATmega2561-8AU. Программатор USBASP. Микроконтроллер 100% рабочий. Питание и контакты программатора припаяны правильно.
      Что можете посоветовать? 
    • Автор: RIMUS1989i
      Всем здравствуйте! Есть необходимость метирить переменное напряжение от трех источников 220v. И питание получать от них же. (1.) Набросал схемку, будет ли она мерить и с какой точностью? измерять думаю в диапазоне от 150 до 250в. по идее точность будет 0.1 вольт. (2.) Но какие подводные камни я могу поймать? (3.) Или придется еще и операционный усилитель лепить на каждый вход АЦП?

    • Автор: spekky
      Добрый день. Никто не делал такую плату? Показалась очень удобной, но продается только в Украине. Печаток различных адаптеров нашел море, какие-то сделал, но этот совмещает в себе вообще все, что мне надо и очень эстетичен. Или может кто-то может помочь с ее покупкой и пересылом? Развести я такую сам не смогу, хоть и понятно, что достаточно даташитов...