ruhi

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

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

ruhi    34

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

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    356

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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


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

Найдите миллионы труднодоступных

электронных компонентов

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

Даладна!!!

:lol:

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

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

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


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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
ruhi    34
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    356
51 минуту назад, ruhi сказал:

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

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

 

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Kudich
      Всех приветствую!
      Сам я программирую на стандартной среде ардуинки, и в одном проекте потребовалось увеличить частоту ШИМ на портах 5,6,9,10,11,13 Arduino Micro. На этой ардуино стоит Atmega32u4, есть тут знатоки avr? Как повысить частоту на этих пинах?
    • Автор: Evg69
      добрый день. Вернулся к микроконтроллерам после длительного перерыва. Сижу туплю и даже гугл не помог.
      Два вопроса по Atmel Studio 7. Режим отладки. Симуляция.
      1. Как включить окно в котором можно посмотреть что контроллер выплевывает
      в UART? Не содержимое регистра, а типа терминала.
      2. Как подсунуть студии файлик с содержимым EEPROM?
    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip
    • Автор: Static
      Доброго дня всем!
      Не так давно решил опробовать использовать в схемах ATmega в корпусе TQFP и возник такой вопрос. На ней имеется аж три ноги на "-" и две под "VCC". Подсоединять нужно все или можно только по одной любой?
      Заранее благодарен за помощь.
    • Автор: Doublman
      Всем доброго времени суток.
      Развел платки - коммутаторы на основные МК.
      Платы коммутационные для HV PROG (параллельного программирования).
      Питание 5в оставил для перемычки (видно на фото).
      Комплект из 3-х плат ATMEGA 8, 16, 32, 48(P), 88, 164P, 168, 324P, 664P, 1284P, 8535, ATTINY 48, 2313.
      https://radikal.ru/fp/4f4203a9b1d54f9fbb92318c2234e576
      Имею 5 комплектов. Цена 450 за все 3 платки ("лист" на этой фотографии) Имею 5 комплектов. https://radikal.ru/fp/73ce63f7f99b4f7d9b744b2563204c1b
      Платки находится в Самаре, если почтой то +50р почте.