Решил поискать реализацию на ассемблере Delay. Нашёл только на Хабре https://habr.com/ru/post/167319/ . Вроде как попробовал и остался доволен. Но(1)...
Ясно, что таймеры ни кто не отменял и конкретные реализации протоколов можно успешно реализовать только на них. Но (2)...
...(2) Иногда все танцы (таймеры) расписаны и жаль делить под разные задачи и это не главные причины. Бывает нужно обеспечить именно простой работы МК для наружной периферии, при этом не соблюдая особой точности, типа ожидания поворота шестерни или обеспечение продолжительности мигания СДИ или пищалки. Да и просто удобно было бы скомандовать "DELAY 250" или "DELAY 1800".
...(1) Реализация Макросом таила подводные грабли: сумасшедший отжор программной памяти. Т.е. чем чаще использовал вызов макроса, тем толще оказывалась прошивка. После причёсывания проблемы, размер распухшей прошивки с 27К, уменьшился до 11К! И это ассемблер! Я и так где надо использовал PUSHF + POPF и даром это не проходило. Спасает от глюков, но платить приходится опять же программной памятью.
Для себя решил минимизировать поглощение программной памяти и пожертвовал 4-е верхних регистра навсегда. Но, если надо, то вставить в макроопределение PUSH + POP, ни кто не запрещает.
Переменные: Спойлер; Объявления переменных для функций Delay .def Delay1=r19 ; переменная функции Delay 1 .def Delay2=r20 ; переменная функции Delay 2 .def Delay3=r21 ; переменная функции Delay 3 .def Delay4=r22 ; переменная функции Delay 4
З.Ы. Пишу здесь, т.к. Хабр не позволяет после регистрации отвечать в старых темах. З.З.Ы. И это естественно не мой код, только адаптация. И, если кому не сложно, то отполируйте его до приличия. У меня просто не хватает времени и думаю, что сам кому-то его сэкономлю, как и программную память.
_________________ Если в голове каша, значит ваш котелок варит!
Последний раз редактировалось DrLithium Ср июн 16, 2021 15:15:59, всего редактировалось 1 раз.
М.б., но я не нашёл других приличных вариантов. М.б. искал мало, время поджимает... Тут мне понравилось, что в одну строку задаётся задержка и достаточная по диапазону. Сам код естественно можно упростить.
Цитата:
Кстати, выход из макроса правильный?
Там же два варианта, с PUSH/POP-ами или выше без них. Ключевое слово "ИЛИ", в середине. А так всё работает, иначе б не давал. Можно было б сделать точный цикл на 1мСек и ещё цикл на чуть меньше, с подстройкой, по сути завершающий (исполняемый вместо основного, при счётчике =0) для учёта задержек на все входы-выходы. На ассме много места не займёт, а вот сервис повысится.
_________________ Если в голове каша, значит ваш котелок варит!
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Я вот не понимаю, 11к, 27к - столько занять может очень серьёзная программа. Ну, допустим, общение с датчиками требует точных таймингов, но это микросекунды. Но городить в серьёзных программах ТАКИЕ вещи - не понятно. Контроллеру некогда будет работать, он будет постоянно висеть в этих задержках.
_________________ Я всё-всё узнAю и стану профессором.
А! Понял! Не оттуда скопипастил. POP вместо PUSH-ей надо писать... Правлю... Спс.
dgrett писал(а):
Но городить в серьёзных программах ТАКИЕ вещи - не понятно. Контроллеру некогда будет работать, он будет постоянно висеть в этих задержках.
Дак писал же выше. В тот момент когда работает подобная задержка, периферии и не нужно ни чего ждать от МК. Это кассетная дека, а не самолёт. Нажал на кнопку - ждёшь реакции ЛПМ и более ничего делать не надо. ЛПМ созрел - работай дальше. Наверно у вас подобных примеров в практике не было
Цитата:
Ключевое слово - вроде.
Дак лично у меня без PUSH-POP-ов работает. А для всех: скопировал кусок - вставил. Скопировал второй, а он не скопировался. В итоге из буфера два раза PUSH-и вставились. Глаз замылился, проморгал, обещаю отслужить, но желательно в июле и желательно в Крыму!
_________________ Если в голове каша, значит ваш котелок варит!
Если не видно, то нижняя ссыль на полную картинку. И как вы могли заметить, местами нужно ждать и по 10 мСек! И да, это настоящая кассетная дека, правда Японская.
А если мне ИК-дистанцию подрубить надо будет, то тут будет заюзан таймер. На автостоп другой. Таймер на автоотключение по бездействию - третий. И т.п. ,т.ч. Delay актуален, для остальных работ.
_________________ Если в голове каша, значит ваш котелок варит!
{ ...(2) Иногда все танцы (таймеры) расписаны} Стесняюсь спросить, а чем у Вас заняты таймеры? По картинке наименьшая задержка 10 МИЛЛИсекунд. То есть самый нулевой таймер, выдающий прерывание каждые 10 мС справится и с задержками и с тем, что Вы ещё повесили.
Таймер конфигим на 10 мС
Тело: ldi delay, 47 sbrc flag, ready rjmp rcall и тд обработка со сбросом флага Bla bla
_int-Timer0: cpi delay, FF breq skip dec delay brne skip sbi flag, ready skip: Дальше Ваша повешенная на таймер задача reti Здесь задержка не точная, но если настроить таймер на 2,5 или 1 мС, то будет точнее. Только тогда в байт не вместится секунда. Взять тогда 2 байта. И не будет ни 11 ни 27 кБ. Может и в тиньку влезет:)
_________________ Я всё-всё узнAю и стану профессором.
Дак выше писал, что три таймера зарезервированы за конкретными задачами. Но далеко ещё не всё написано и таймеры берегу для более важных функций.
Цитата:
То есть самый нулевой таймер, выдающий прерывание каждые 10 мС справится и с задержками и с тем, что Вы ещё повесили.
А теперь посмотрите на диаграмме, на какое кол-во событий нужно повесить подобную процедуру и посчитайте кол-во потраченной программной памяти. Одна строчка "DELAY_MS 10", при этом не жрущая память не лучший ли выбор в данном случае? Самое не понятное, почему нужно ждать когда параллельно работающий таймер созреет и после возвращаться в обработчик, при этом крутить нопы в бесконечном цикле или проверять не актуальное в это время?
По проекту: я описал в нём только 5-ь состояний ЛПМ, а сожрано уже 11КБ! 23-и вызова "DELAY_MS" и это только в режимах, а есть и другие места где использовано, считать всё лень. Вы реально предлагаете 23-и раза перезадавать таймеру значения и с ростом числа использования подобного жеста, ещё больше отдавать программную память? Можно написать макрос для таймера, но зачем прыгать из-в с использование таймера, если актуальное место фокуса это обработчик текущего состояния ЛПМ?
Когда упёрся в 27КБ, понял что где-то проблема. Решил её и вот тут решил поделиться решением. А впереди ещё более 6-и режимов, но "хелперы" описаны и реализация алгоритмов состояний (и переходов из-в) не займёт много места.
Цитата:
И не будет ни 11 ни 27 кБ. Может и в тиньку влезет:)
Ни как не влезет. 8 Кб это основной код со всеми накладными расходами, а DELAY не жрёт лишнего. Это только кажется, что 4-КБ за глаза. Я и сам так думал когда писать начинал. 27 КБ был ударом по мозгам! В данном проекте замещается 42-х ногая микруха и 33 пина активны. Состояний и переходов между ними, оказалось многовато. М.б. где-то ещё можно скостить памяти, но в данном проекте я жертвую компактностью в угоду наглядности, универсальности и расширяемости. Будет добавлен USART, ИК-управление и возможно работой с периферией по I²C.
З.Ы. На СИ, я бы давно побежал покупать новый камушек.
_________________ Если в голове каша, значит ваш котелок варит!
А зачем нам лезть в прерывание? Это в данном случае чем полезно? Вот последовательность: состояние "Плей", нажата кнопка "перемотка вперёд". Нужно вернуться в состояние стоп: отключить СДИ, задать новое положение программной шестерне, отключить подмотку, а уже после активировать сам режим "перемотка вперёд", со всем жестами. Зачем мне прерывание, если у меня последовательность действий с перерывами (DELAY тут подходит на 100%) по времени и в это же самое время ни на что реагировать не надо?
А в самом прерывании тогда нужно будет проверять... 3X4=12 (и это только на текущий момент) вариантов сценариев. Т.е. обработчик будет не вне прерывания, а внутри? Для чего это?
_________________ Если в голове каша, значит ваш котелок варит!
В одном аппаратном таймере несложно сделать несколько виртуальных. Закинул в определённый регистр заданную длительность задержки - и продолжаешь выполнять рабочую программу, периодически посматривая на флаг ЗАДЕРЖКА ОТРАБОТАНА.
Опять стесняюсь спросить, зачем там у Вас вообще мк нужен?
Серьёзно? Зачем? Вам юзер мануал скинуть? Набор функций имеющихся на борту, устанете на рассыпухе делать. А размер при этом какой будет? А надёжность? А потребление тока?
Изначально стоит LM6402A, потеря этого МК автоматом ставит крест на ремонте аппарата, т.к. просто их, с этой прошивкой, ни где не достанете, даже за огромные деньги! Не делают и уже очень давно. Реплика нужна в первую очередь, что б решить эту проблему.
Цитата:
В одном аппаратном таймере несложно сделать несколько виртуальных. Закинул в определённый регистр заданную длительность задержки - и продолжаешь выполнять рабочую программу, периодически посматривая на флаг ЗАДЕРЖКА ОТРАБОТАНА.
Вот об этом то и речь, что когда надо сидеть в бесконечном цикле - понято. А вот вопрос, когда не надо там сидеть, что делать? Любому школьнику ясно, что прерывания спасают. Но, если вам это спасение даром не нужно, то где реализация задержки на подобие СИ-шной?
_________________ Если в голове каша, значит ваш котелок варит!
{Вам юзер мануал скинуть? } Может, programming? {когда надо сидеть в бесконечном цикле} Вы и так в бесконечном цикле сидите, мк по другому не может. А вообще, я теперь понимаю, откуда 27кБ. ПилИте, Шура (с)
_________________ Я всё-всё узнAю и стану профессором.
Вы и так в бесконечном цикле сидите, мк по другому не может. А вообще, я теперь понимаю, откуда 27кБ.
Ну вот началось хамство. Откуда 27КБ было объяснено доступным языком и почему так вышло тоже! Получается взял пример нуба, который ни один профи, вроде вас, причесать не соизволил. И не сидит МК в бесконечном цикле постоянно - это только у нубов всё просто. У меня прерывается или процедурой или прерыванием! Учите азы, умничать после будете.
Не беспокойтесь, всё уже распилено до вас и без вашей помощи. Вам же давал скрин диаграммы, вы хоть его чуть посмотрели внимательно, что б писать после вот это:
Цитата:
Опять стесняюсь спросить, зачем там у Вас вообще мк нужен?
А вот в вашем кунг-фу я сильно сомневаюсь, особенно после совета запихнуть в прерывание обработчик всего и вся! Я так понял вы способны только на умные фразы вроде:
Цитата:
ПилИте, Шура (с)
Мне тоже цитатами начать крыть? Дельного с вас, как с козла молока. Вам всё объяснил и по полочкам разложил, а вы обиделись, что косяков не нашли. Не стыдно?
_________________ Если в голове каша, значит ваш котелок варит!
Ах, прости, дядька, засранца. Если стану хамить, у Вас дар речи отнимет. По делу. Я могу для Вас написать обработчик этой шняги без всяких задержек. Так, как сделал бы себе. Но только не с телефона. А мк, повторюсь, ВСЕГДА работает в непрерывном цикле. И быть иначе не может.
_________________ Я всё-всё узнAю и стану профессором.
Вы обо мне ни чего знать не можете. Фантазии на офф!
Цитата:
Я могу для Вас написать обработчик этой шняги без всяких задержек. Так, как сделал бы себе. Но только не с телефона.
Судя по вашим фантазиям, поделка будет так себе. Тем более, вы не справитесь с подобной задачей на должном уровне. Что б вы имели представление, вот вам одна из проблем: переход из перемотки в плей ведёт к потере высоких частот на 3-5 секунд. Что будете делать? Ась? Я-то знаю и решу в ближайшее время, а дилетанты мне ни к чему!
Цитата:
А мк, повторюсь, ВСЕГДА работает в непрерывном цикле. И быть иначе не может.
Да не. Ну правда? Всегда? А что такое прерывания знаете? Или вы мне решили Америку открыть подобным заявлением? Я о бесконечном цикле в МК, узнал ещё в 2008-м году, когда только начал изучать. Удивить меня решили всем известным фактом? Зачем? Ум показать? Кунг-фу знаний? Крутость? Мне это от вас не в какой форме подобного не надо, по вашим вопросам уже сложил впечатление. Тренируйтесь на кошках.
_________________ Если в голове каша, значит ваш котелок варит!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения