Придирки по длине меток, макросов и прочего оформления отношу к теме "Мне делать нечего, дайте мне докопаться до столба".
Одно то, что это работает и работает просто на плате из Вашей темы через три проводочка вместо Мега8 «бьет» все ваши придирки и в том числе по алгоритму защиты от помех!
А линейная интерполяция вообще мало у кого есть. Плавное изменении УОЗ от оборотов, а не скачком. Я не совсем уверен, что она нужна на самом деле, но мне это было интересно математически.
Кроме того, много раз писал и еще раз напишу. Входы прерывания на микроконтроллере предназначены для работы в цифровых схемах. Нельзя на них подавать потенциально зашумленный сигнал и реагировать на факт спада или фронта. Повторное чтение обязательно. В Вашей прошивке это тоже было сделано, но по-моему уже когда я опубликовался – вот тут могу ошибиться. До этого момента Вы «ослепляли» вход датчика.
То что касается "разбираться в чужом коде" ….. Буду куски кода тоже показывать...
«..Очень удивился, когда увидел, что АЦП измеряется только на минимальных оборотах....»
Не в режиме малых оборотов, а в режиме СТОП. В режиме любых оборотов (когда есть изменение входных линий) все находиться в другой части, а именно
Ниже метки C_Start:.... rcall StartADC
Ниже метки C_Stop:... rcall ReadADC
«...К тому же он меряет не 0..255, а 0..3 (нет левого выравнивания). Замеры проверялись?...»
«...Что он усредняет в кольцевом буфере, думаю, сами догадались?..»
Левое выравнивание устанавливается в другом регистре (ADMUX) и сделано это в секции инициализации
ldi A,0b01100000+OUZCanBit ;Номер канала мультиплексора АЦП
Всё остальные замечания по АЦП - следовательно от невнимательности.
«...Всё время замера МК топчется на одном месте, отнимая ресурсы:...»
Процессор все время бегает по телу основной программы не отнимает он ресурсы, а выполняет важные действия - обслуживание UART и усреднение по точкам буфера АЦП. В это время прерывания не запрещены и все процессы, связанные с зажиганием полностью обслуживаются. В том, что я предоставил не требовалась эквидистантная выборка значений напряжения на входе АЦП. Все это предназначено для ДПДЗ в виде потенциометра. Новое СРЕДНЕЕ значение появляется на каждом обороте двигателя. Оно точно будет соответствовать положению ДПДЗ после 2 оборотов двигателя и более, если длину буфера усреднения увеличивать конечно:
.equ OUZAverCount= 8 ;!!!Длина кольцевого буфера усреднения отсчетов АЦП OUZAver
Вопрос подключения ДАД пока детально не рассматривался. Надо будет сделаю, вплоть до схемы, вот только точно не буду в качестве операционного усилителя компаратор с ОК применять.
«….UART… Тут вообще отдельная песня….….Я понимаю, что обмен идёт только при настройке. Но ведь именно при настройке вы меняете углы или смотрите график…»
Нет конечно не так. Наслаждайтесь, раз это песня. Моя версия работы с UART носит классический характер. А именно через полную буферизацию. Благодаря этому я могу без ущерба основной роли прошивки по каналу гонять большие массивы информации во время работы зажигания – целиком таблицы, любую отладочную информацию и даже, если надо, данные о режиме работы двигателя (последнее не сделано еще конечно). В основном цикле все данные постепенно перекачается куда надо.
«…При настройке (когда подключён UART), ему пофиг, занимается ли процессор расчётом искры или нет –он шурует свой обмен, ну хоть бы флаги запрета поставили:…. «
Эта Ваша мысль опять таки по невнимательности. Подпрограмма UARTMODE это выделение кванта времени на действие с буферами приема-передачи.
UARTMODE:
rcall TransmiteData //Y,B,A
rcall CheckUARTflags
rcall ReadCmd
ret
Передать, если что есть и команду выполнить , если буфер входной не пуст.
«…От блока декодирования 24 команд UART (284 строки программы) я слегка окосел..»
Во-первых там не только декодирование, но и исполнение их. Во-вторых идеология построения моего алгоритма обмена допускает всего 256 команд. Режим работы: Ведущий-ведомый. Посылка в сторону прошивки всегда короткая – 1 байт. Связано это только с тем, что бы не наносить вред основному предназначению прошивки. Ответ прошивки может быть длинный, но только по команде. Она его передает в свободные «кванты» времени. Поэтому обмен у меня работает УСТОЙЧИВО во всем диапазоне оборотов двигателя. Такая архитектура обмена позволила сделать и управляшку – там тоже полная буферизация и поэтому ничто не тормозит.
«….Далее про каллиграфию- на скорость не влияет, но если вы решили допилить программу под новые фишки или просто в ней разобраться, вам это не помешает…»
Вы что-то попутали товарищ, я её писал, а Вы пилили чужую. Я могу её с легкостью переоблицевать на разные движки - Спасибо товарищам, которые решились на установку. В Ютубе есть видосы. А менять приходиться по большому счету только две процедуры и пару констант – и да мне лично, поскольку реально трудно разобраться в чужой программе.
В теме про одноцилиндровый двигатель если пользователь остался на уровне Главной разметочной таблицы и редактировании констант – то это моя прошивка, и мне за неё отвечать. Если оптимизаторы полезли глубже – это уже их прошивка на основе моей и вопросы уже им задавайте.
«…В программе много подпрограмм, выполняющихся за цикл один раз. Почему они не внедрены в основное тело программы? Может это какой-то блок, ну так в комментарии укажи… Много «глухих» меток – опять укажи в комментариях.. «
Отвечу на это так. Подпрограммы как правило вводятся не только для того, что бы многократно их вызывать. Еще есть задача обозначения скелета программы, процедур ветвления по средствам команд sbrc, sbic и т.д. Это же одно из правил хорошего тона при программировании. Времени на полномасштабные комментарии естественно не хватает… Глухие метки (те, на которые ссылок нет?) – то же для визуальной читаемости мне как автору…
«....Зачем мне эти коэффициенты непонятные Ка (сейчас понятные), внутреннее или внешнее тактирование, замена частоты МК и т.д., если они в инструкции как пользоваться не описаны. …»
Не правда, они в инструкции упоминаются – это раз. Второе – я оставляю за собой право детально не описывать используемые математические формулы. Ka – есть её составная часть и рассчитывается в Главной разметочной таблице. Между прочим, расчетные формулы подогнаны под возможности вычисления МК в формате с фиксированной запятой, линейная интерполяция и прочее.
«….Макросы длиной в 2 команды… Дублирование команд с константами, и даже двойные вызовы подпрограмм…»
С макросами как раз все понятно – как мне удобно, так и делаю. А вот «двойные вызовы» - подловил меня наконец!!! Однако эта подпрограмма отслеживает состояние буферов приема-передачи. Ничего страшного, что уточнил их состояние лишний раз.
«…"Мёртвые макросы" на светодиоды..»
Они существуют только в тексе исходника. Обидно их опять писать, если в процессе адаптации для какой- то задачи они опять потребуются.
«….Укладка подряд в стек по 11 регистров? Автору регистров не хватает или про ОЗУ забыл?..»
А стэк это не ОЗУ? Стэк удобное средство программиста. В конце концов, операция со стеком короче в циклах, чем sts/lds. И наконец – мне так удобнее.
«… Большинство регистров используется как временные, и сказать, что там хранится-затруднительно..»
.def NL = r14 ;Младший байт значения счетчика-измерителя числа оборотов
.def NH = r15 ;Старший байт значения счетчика-измерителя числа оборотов
.def temp = r17 ;Временный регистр
.def PSREG = r5 ;Временный регистр хранения SREG
.def RMaskchain = r4 ;Регистр, содержащий маску-длина защитного протокола.
.def Selectr = r18 ;Селектр в таблице оборотов UOZ
.def zerro = r12 ;Нулевой регистр 0x00!!!
.def full = r13 ;Единичный регистр 0xFF!!!
.def StartChain = r3 ;Цепочка бит протокола защиты от импульсных помех начальной метки
.def StopChain = r2 ;Цепочка бит протокола защиты от импульсных помех конечной метки
.def Events = r25 ;Селектр событий. Четыре старших бита состояние канала LStart. Четыре младших бита состояние канала LStop.
.def DeltaL = r7 ;Ширина выбранного Seleсtr диапазона
.def DeltaH = r8
.def RaznostL = r9 ;Разность между оборотами и нижним пределом выбранного диапазона
.def RaznostH = r10
.def TableAdress = r11 ;Адрес для чтения/записи Таблицы по UART
.def StopCnt = r6 ;Отсчеты моментов переполнения таймера
Лично я вижу один временный регистр temp, который к слову вместе с парой Z у меня предназначен только для использования в программах обработки прерывания. Остальные несут смысловую и функциональную нагрузку в примененном способе расчетов. Я его и не обещал раскрывать, хотя в нем ничего такого нет сложного. Пришлось выкручиваться из ситуации, когда исключил оценку частоты вращения в потенциальный интервал искрообразования – внутри импульса LDELTA. От того формулы приобрели не совсем удобный вид.
;*********************************** Общие регистры
.def A = r19 ;Свободны r0, r1, XL, XH, YL, YH
.def B = r20
.def C = r21
.def D = r22
Это регистры, не несущие никакой нагрузки – используются в качестве РОН.
«… Что за порочная практика, складывать .def и .equ из другого .include? ….»
Поймайте меня еще раз. Я не пойму где это нашли..Разве, что случайно буковки совпали.
«…Это тупик для дальнейших разработок..»
Поживем – увидим.
ИМХО на ИМХО - Ваше сообщение очень похоже на «..Молодой человек, я за Вами бежала 3 километра (..2 недели..), чтобы сказать, что Вы мне глубоко безразличны..».
Удачи в Вашем нелегком труде.