AlexS4, да, этот код подходит и к моему "неполноценному" енкодеру подходит, а про помехи какие мысли будут?
Добавлено after 2 minutes 59 seconds: но вопрос: по какому условию сдвигать регистр? если при каждом опросе, то если я буду крутить медленно - то такой паттерн никогда не соберётся... если по изменению, то даже небольшой дребезг и будут большие пропуски, ведь этот паттерн это даже не 3, а 4 проверки и если система нестабильна - пройти их будет трудно...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
если по изменению, то даже небольшой дребезг и будут большие пропуски, ведь этот паттерн это даже не 3, а 4 проверки и если система нестабильна - пройти их будет трудно...
думаю надо попробовать, скорее всего при правильном времени таймера семплирования ~5..20mS будет много попадений, пасаны ж утверждают что антидребезг это ненаучная хрень и КОТельников типа против такого
но если таки нет то можно перед этим применить алгоритм антидребезга проверяющий стабильность 2х последовательных семплов (еще выше писал) тоесть двигать по 2му одинаковому сэмплу. для этого для таймерного прерывания потребуется выделить еше 1 статическую переменную (регистр) с предыдущим семплом в 2х битах.
я попробую но с 3мя, а не с 4 мя семплами в памяти (заносить буду в 3 и 4 бит, т.е. 2 младших бита не будут использоваться и будут всегда нулями и в рабочем регистре и в маске сравнения)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
нене это против концепции!! заноси все а вот паттерны можно более короткие применять, нормализовать окно (and/or mask) при этом ненужно, важно только чтоб неиспользуемые биты паттерна были заполнены теми же значениями на которые ресетится EcSeq переменная при совпадении паттерна (удобно 0 заполнять в avr)
оно же наполняет EcSeq по факту до 1го совпадения с паттерном, а дальше веравно ресетит и продолжается набор последовательности
ну конечно важно чтоб цикл проверки паттернов был достаточно быстрым (не перегруженным долгими непрерываемыми алгоритмами) чтоб не пропускать "лишние" семплы в последовательнось от таймера. но для энкодера это 10ки mS, так что врядли с этим могут быть проблемы.
Последний раз редактировалось AlexS4 Вт фев 18, 2025 11:07:43, всего редактировалось 1 раз.
я принцип не меняю и заношу всё, просто обрезаюне слева, а справа, при этом экономлю и флеш и время (зачем чтото чистить, если можно и не мусорить?) тем более у меня входы на 3 и 4 бит приходят - достаточно на 1 вправо сдвинуть и вуаля...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
а чистить же всеравно нужно! сразу после обнаружения совпадения! иначе последовательность будет продолжать совпадать с паттерном и вызывать процедуру +1 или -1 снова и снова ...пока энкодер еще раз не потрогают и он не даст чтото отличное от паттернов
а вот проверка длины записанной последовательности это ненужное усложнение (довольно критического к избыточностиям) обработчика прерывания
слева и справа - совершенно без разницы, я сначала ж предложил в младшие задвигать, а потом просто заметил что битовое бинарное представление паттерна становится более наглядным при задвигании семплов со старших битов (ror)
AlexS4, да, после обнаружения совпадения - конечно, его (это совпадение) надо разрушить... длину записанной последовательности я и не проверяю.
в остальном спор ни о чём: для мк без разницы, откуда задвигать... просто мне нет нужды двигать до края (+2 команды), чтобы потом перед сравнением накладывать маску (ещё +2 команды), ведь там скраю, от которого двигаешь, неоткуда взяться данным и там и так всегда нули пока сам туда ничего не внесёшь, а значит ни маскировать ни чистить ничего не надо.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
если я правильно понял, то доп двигать сэмпловый регистр никуда не нужно в любом случае, просто неполный (короткий) паттерн должен быть дополнен 0ми (точнее дефолтным послесбросовым заполнением) с нужной стороны. это просто вопрос формирования хардкодной константы.
Ну может человек боится прерываний, не умеет нормально писать обработчики...
Если не используешь прерывания, но тем более нужно стараться писать максимально быстрый нигде подолгу не зависающий код, особенно если еще и критикуешь ЯВУ за недостаточную эффективность)
У меня с прерываниями простое правило: где необходимо, прыгаю в прерывания, в остальных случаях обработку флагов прерываний провожу в окнах основного круга программы. В прерывании минимально необходимые действия. Вот и в моём примере с кнопками не использую таймер с прерываниями, условия задачи это позволяют. Здесь таймер с прерываниями – лишнее усложнение задачи, зачем это нужно.
ps. Я, кстати, вспомнил, что AQ29 на easyelectronics свой "современный ассемблер", который пока нигде нельзя списать, еще в 2017 рекламировал. По идее общедоступная версия уже должна быть на подходе )
Может быть, не я это был. В 2017 году всё только начиналось, да и было это несерьёзно.
На ассемблере программа всегда либо ходит по кругу, либо переход между кругами.
открою тебе секрет: на любом языке программа ходит по кругу и по вложенным кругам.
Какой же это секрет? Всё в конечном итоге сводится к машинным кодам, фактически, к ассемблеру. Только на ЯВУ, которые нехороши, код сильно «раздувается».
Может быть, не я это был. В 2017 году всё только начиналось, да и было это несерьёзно.
Думаете много есть людей в русскоязычном пространстве которые, как минимум раньше, юзали АБ, а сейчас пишут для AVR на хорошем/современном/макро ассемблере которого нет в общем доступе, при этом С они не знают и примеры приводят на бейсике? И в каком там состоянии этот ассемблер был в 2017-м вообще не важно, вы и сейчас популяризируете то, чем другие пользоваться не могут )
Не представляю ситуацию, где можно МК напрямую подключить к сетевой фазе.
А в чем вы видите проблему такого подключения? Намекну, в любой стиральной машине МК подключен напрямую к сетевой фазе. Точнее, может быть подключен с вероятностью 50%.
Давно читаю эту тему и просто опишу что у меня работает. 24 входа обновляются каждую миллисекунду в три байта, в последствии каждый бит проходит через фильтр переменной, устанавливаемой юзером длиной, берётся этот параметр из таблицы 24 + 24 байта, соответственно на 1 и 0 отдельно, Длина настройки байт, то есть 0....250, четверть секунды максимально. На каждый входной бит оперативка используется по два байта, на счётчик единиц и счётчик нулей отдельно. Получается в итоге то чтобы на выходе фильтра установилось значение это нужно насчитать совпадений всех выборок согласно таблицы от 0 - это получается выход в точности копирует вход, и до 250, когда нужно чтобы вход повторился 250 раз. Программа написана на ACM2 в AStudio. Потребляет в самом коротком случае 17us, до самого длинного случая 30us. Главный цикл 1 ms, вот и вызывается эта программа сразу после обмена вход/выход. Можно было конечно количество оперативки необходимой уменьшить, но у меня была главной задачей это скорость, по этому код долго вылизывался. Дополню ещё что для кнопки достаточно выставить 30.30 или 40.40 и уже никто не сможет протрезвонить кнопкой, кнопка чётко отрабатывает нажатие, дал специально стенд человеку чтобы он увидел дребезг, не смог, сдался. Чуть не забыл - ATmega 168 - 20 mgz.
Я ему провода для подключения выдал на стенде, так что он мог подключать любые кнопки или концевики, ну светодиод при каждом нажатии просто инвертировал своё состояние.
Ну какой это тест? Это не показатель. А люди, как известно, разные. Один просто шустрый, а другой чемпион и что?) Вот ARV говорит что люди не могут нажимать быстрее 50 мс (не помню), а Старичок вообще 100 мс (не помню) ставит на нажатие. Это его реакция - значит другие быстрее быть не могут.)
Я сам юзал эту кнопку и нашёл правильный ответ - 30.30 или 40.40, Очень удобно, можно например 250 выставить, тогда получается удерживать надо. А если 0 выставить, то тут кошмар - светодиод остаётся в непредсказуемом состоянии, конечно от кнопки всё зависит, тогда я себе сказал - я программист и знаю как кнопку обмануть, тогда и пришла мысль чтобы кто нибудь другой эту кнопку понажимал.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения